一.问题的发现
最近,在使用分布式任务powerjob时,发现了数组分页后的序列化问题。 事情是这样的。 在我运行MapReduce模式的时候,我发现我正在生成子任务时间com.esoteric software.kryo.kryo5. kryoexception : classcannotbecreates 33660 Java.util.ArrayList $ sublistserializationtrace : outplaceidlist错误。 意思是不能创建我正在参与的outplaceidlist对象。
二.问题排查
如果仔细看日志,好像是序列化问题导致的。
百度之后也有类似的问题。 https://blog.csdn.net/weixin _ 43060346/article/details/87104010
当我检查代码时,我发现我的参与是直接使用的Lists.partition方法分页后的子列表。 我想是这个原因,首先直接new list,重新启动后发现问题已经解决了
三.分析源代码
因此,问题很明显,这个list寻呼后的对象是不能序列化的。 关于powerjob的MapReduce源代码,这里没有深入探讨,而是集中在以下Lists.partition中是如何生成的:
来到这里,最终发现使用了一种叫做subList的方法。 进入subList,里面的get方法实际上回来了
ArrayList.this.element data (offset index ); elementData对象是根据分页偏移剪切的对象,但当您查看elementData对象的修饰符时,就发现了问题。
transient修饰符表示此elementData对象不能序列化。 因此,如果在Lists.partition方法中直接分页的对象被序列化,则会报告开头提到的错误。