当我使用 kryo 反序列化 ArrayList 对象时,我得到一个 NullPointerException。
Caused by: java.lang.NullPointerException
at java.util.ArrayList.ensureExplicitCapacity(ArrayList.java:215)
at java.util.ArrayList.ensureCapacity(ArrayList.java:199)
at com.esotericsoftware.kryo.serializers.CollectionSerializer.read(CollectionSerializer.java:96)
at com.esotericsoftware.kryo.serializers.CollectionSerializer.read(CollectionSerializer.java:22) at com.esotericsoftware.kryo.Kryo.readObject(Kryo.java:679)
at com.esotericsoftware.kryo.serializers.ObjectField.read(ObjectField.java:106)
我可以看到 StdInstantiatorStrategy 创建了一个 ArrayList 而没有调用其构造函数,留下未初始化的字段之一导致异常。
文档说应该首先调用无参数构造函数,如果没有可用的构造函数,则应该使用 StdInstantiatorStrategy 逐字段初始化。
我做错了什么?
最佳答案
使用 kryo 2.24 版本,调用
kryo.setInstantiatorStrategy(new StdInstantiatorStrategy());
覆盖默认实例化器策略,如果存在则使用类无参数构造函数。正确的做法是调用:
((Kryo.DefaultInstantiatorStrategy) kryo.getInstantiatorStrategy()).setFallbackInstantiatorStrategy(new StdInstantiatorStrategy());
这里有解释https://github.com/EsotericSoftware/kryo
我认为这在 2.21 版后发生了变化
关于java - kryo.readObject 导致 ArrayList 出现 NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23962796/