java - kryo.readObject 导致 ArrayList 出现 NullPointerException

标签 java kryo

当我使用 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/

相关文章:

java - TCP Socket 交换 kryo 序列化对象

java - kryo 序列化是否适用于不可序列化的类并且类具有不可序列化的属性?

java - QuickFIX/J - 故障转移策略

java - 使用AOP和Guice 3在第三方代码中将 `new Socket()`重新定义为 `new Bar()`?

java - 按下按钮时更改 JLabel

java - 不同 tomcat worker 的 Log4j

java - 在 Kryonet 中增加服务器/客户端的缓冲区大小

java - 安卓转接电话

java - Kryo throw "Encountered unregistered class ID: 44"

java - Spark 中 HashMap 的 Kryo 反序列化失败