Java - 反序列化 InvalidClassException (No valid constructor)

2022-09-03 07:09:59

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

下面是对象的继承工作原理的示例。我正在序列化和反序列化的对象是人。

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

Living、Animal 和 NPC 不实现 Serializeable。我无法改变这三个类。人和孩子确实实现了可序列化。人和生活也是抽象的类。我可以序列化一个人(谁是孩子)并发送它,但是当我尝试反序列化一个人(谁是孩子)时,我会在孩子上得到一个无效的ClassException,说“没有有效的构造函数”。

为什么会发生这种情况?Living、Animal 和 NPC 是否都必须实现可序列化?


答案 1

在以下问题的解串化 ArrayList 的回答中做了很好的解释。没有有效的构造函数

长话短说 - 在你的情况下,你需要无arg构造函数来表示你的类的第一个不可序列化的超类。NPC

如果您无法访问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 {
// ..
}

答案 2

根据此线程,它们不需要实现可序列化,但它们(或者至少是NPC,因为它是层次结构中的第一个不可序列化的类)必须包含0参数构造函数。如果类中没有定义构造函数,则隐式构造函数是 adaquae 的,但如果在这些类中定义了其他构造函数,则必须编写显式 0 参数构造函数。

由于您无法控制 NPC,请尝试创建它的子级,该子函数定义了一个显式的 0 参数构造函数,但该构造函数未实现 Serializable,并查看这是否不起作用。