Java 如何使用Apache Flink解决com.esotericsoftware.kryo.kryo.readObject上的NPE?
我正在使用Flink和自定义kryo类作为我的pojo类。但是Java 如何使用Apache Flink解决com.esotericsoftware.kryo.kryo.readObject上的NPE?,java,serialization,apache-flink,kryo,Java,Serialization,Apache Flink,Kryo,我正在使用Flink和自定义kryo类作为我的pojo类。但是 Caused by: java.lang.NullPointerException at MyTreeSerializer.read(MyTreeSerializer.java:36) at MyTreeSerializer.read(MyTreeSerializer.java:11) at com.esotericsoftware.kryo.Kryo.readObject(Kryo.java:657)
Caused by: java.lang.NullPointerException
at MyTreeSerializer.read(MyTreeSerializer.java:36)
at MyTreeSerializer.read(MyTreeSerializer.java:11)
at com.esotericsoftware.kryo.Kryo.readObject(Kryo.java:657)
at org.apache.flink.api.java.typeutils.runtime.kryo.KryoSerializer.copy(KryoSerializer.java:172)
at org.apache.flink.streaming.runtime.tasks.OperatorChain$CopyingChainingOutput.collect(OperatorChain.java:414)
... 16 more
以下是详细信息-
env.getConfig().addDefaultKryoSerializer(MyTree.class, MyTreeSerializer.class);
```
与
env.getConfig().addDefaultKryoSerializer(MyTree.class, MapSerializer.class);
则id未序列化,但映射正在序列化
使用MyTreeSerializer.class时,为什么它不起作用,需要帮助
提前感谢。MyTreeSerializer中的以下行将导致
空值:
MyTree myTree = kryo.readObject(input, type, new MapSerializer());
这也是为什么myTree.setId(id)
会导致
NullPointerException
当您使用MapSerializer
时,它工作正常(当然id的反序列化除外),因为MyTree
扩展自实现Map
的TreeMap
在MyTreeSerializer
的实现中,您试图从MyTree
对象反序列化类MyTree
的成员。这就像MyTreeSerializer
需要一个如下示例代码中所示的对象:
公共类MyTree扩展树映射{
私有字符串id;
私家MyTree MyTree;
公共字符串getId(){
返回id;
}
公共无效集合id(字符串id){
this.id=id;
}
公共MyTree getMyTree(){
返回我的树;
}
公共void setMyTree(MyTree MyTree){
this.myTree=myTree;
}
}
它认为您需要查看
MapSerializer
并从中进行扩展,或者将其用作自己实现的基础,以便序列化和反序列化MyTree对象。MyTreeSerializer中的以下行导致空值:
MyTree myTree = kryo.readObject(input, type, new MapSerializer());
这也是为什么myTree.setId(id)
会导致
NullPointerException
当您使用MapSerializer
时,它工作正常(当然id的反序列化除外),因为MyTree
扩展自实现Map
的TreeMap
在MyTreeSerializer
的实现中,您试图从MyTree
对象反序列化类MyTree
的成员。这就像MyTreeSerializer
需要一个如下示例代码中所示的对象:
公共类MyTree扩展树映射{
私有字符串id;
私家MyTree MyTree;
公共字符串getId(){
返回id;
}
公共无效集合id(字符串id){
this.id=id;
}
公共MyTree getMyTree(){
返回我的树;
}
公共void setMyTree(MyTree MyTree){
this.myTree=myTree;
}
}
它认为您需要查看
MapSerializer
并从中进行扩展,或者将其用作自己实现的基础,以便序列化和反序列化MyTree对象。可能重复@hotzst No。不是。它更像是kryo+Flink相关的问题,您提供了NPE的堆栈跟踪,但没有指出这与代码中的哪行相关。有一个东西null
找出它是什么以及为什么。可能是@hotzst No的重复。不是。它更像是kryo+Flink相关的问题,您提供了NPE的堆栈跟踪,但没有指出这与代码中的哪行相关。有一些东西是空的,找出它是什么以及为什么。
env.getConfig().addDefaultKryoSerializer(MyTree.class, MapSerializer.class);
MyTree myTree = kryo.readObject(input, type, new MapSerializer());
public class MyTree extends TreeMap {
private String id;
private MyTree myTree;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public MyTree getMyTree() {
return myTree;
}
public void setMyTree(MyTree myTree) {
this.myTree = myTree;
}
}