Java - 反序列化InvalidClassException(无有效的构造函数)

Wil*_*Boy 15 java serialization deserialization

我正在尝试序列化一个对象,然后在将其数据发送到客户端程序后反序列化它.

这是对象继承如何工作的一个例子.我正在序列化和反序列化的对象是人.

生活 - >动物 - > NPC - >人 - >儿童

Living,Animal和NPC不实现Serializable.我无法改变这三个班级.Person和Child确实实现了Serializable.人与生活也是抽象的阶级.我可以将一个Person(谁是一个Child)序列化并发送它,但是当我尝试反序列化一个Person(谁是一个Child)时,我在Child上得到一个InvalidClassException,说"没有有效的构造函数".

为什么会这样?Must Living,Animal和NPC都实现Serializable?

uda*_*mik 13

在下面的问题的答案中做了很好的解释 反序列化ArrayList.没有有效的构造函数

长话短说 - NPC在你的情况下,你需要no-arg构造函数用于你的类的第一个非可序列化的超类.

如果您无权访问NPC并且它不包含no-arg构造函数 - 那么您可以在层次结构中添加一个"假"类,这将选择正确的类.例如

class SomeClass extends NPC {
// will be called during deserialization
public SomeClass(){
// call custom constructor of NPC
super(null);
}
}

class Person extends SomeClass implements Serializable {
// ..
}
Run Code Online (Sandbox Code Playgroud)