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

标签 java serialization deserialization

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

这是对象继承如何工作的示例。我正在序列化和反序列化的对象是人。

生活 -> 动物 -> 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/

相关文章:

java - 如何在android中点击后永远隐藏按钮?

java - 将自定义弹出窗口/ View 添加到 android 中的 Activity

java - 无法找到主类。程序将会退出

java - 在 Kryo 中序列化和反序列化对象数组

java - 为什么我的 "marshaller"必须是 "static"?

java - Gson自定义反序列化以产生不同的json输出

java - JPA 与 JavaBeans 验证 (JSR 303) 与您的解决方案 : Automatically truncate field before persisting

generics - Swift 通用对象/JSON 序列化

java - Serializable/Cloneable/... 的惯用设计在 Scala 中看起来如何?

.net - 枚举序列化 Json 与 XML