我正在尝试序列化一个对象,然后在将其数据发送到客户端程序后将其反序列化。
这是对象继承如何工作的示例。我正在序列化和反序列化的对象是人。
生活 -> 动物 -> NPC -> 人 -> child
Living、Animal 和 NPC 不实现 Serializable。我无法更改这三个类。 Person 和 Child 确实实现了 Serializable。 Person 和 Living 也是抽象类。我可以很好地序列化一个人(他是一个 child )并发送它,但是当我尝试反序列化一个人(他是一个 child )时,我在 child 上得到一个 InvalidClassException,说“没有有效的构造函数”。
为什么会这样? Living、Animal 和 NPC 都必须实现 Serializable 吗?
最佳答案
在以下问题的答案中做了很好的解释 Deserializing an ArrayList. no valid constructor
长话短说 - 您的类的第一个不可序列化父类(super class)需要无参数构造函数,在您的情况下为 NPC
。
如果您没有访问 NPC 的权限并且它不包含无参数构造函数 - 那么您可以向层次结构中再添加一个“假”类,它会选择正确的类。例如
class SomeClass extends NPC {
// will be called during deserialization
public SomeClass(){
// call custom constructor of NPC
super(null);
}
}
class Person extends SomeClass implements Serializable {
// ..
}
关于Java - 反序列化 InvalidClassException(没有有效的构造函数),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12125076/