2012-08-25 69 views
14

我试图序列化一个对象,然后在将数据发送到客户端程序后将其反序列化。Java - 反序列化InvalidClassException(无效的构造函数)

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

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

生活,动物,和NPC不会实现Serializable。我无法改变这三个班级。 Person和Child做了Serializable。人与生活也是抽象类。我可以序列化一个人(他是一个孩子)并发送它,但是当我试图反序列化Person(他是一个孩子)时,我在Child上得到一个InvalidClassException,并说“没有有效的构造函数”。

这是怎么发生的?必须生活,动物和NPC都实现Serializable?

+3

可能相关:http://stackoverflow.com/questions/8632148/java-object-serialization-and-inheritance – leonbloy

回答

13

很好的解释是为回答以下问题做 Deserializing an ArrayList. no valid constructor

长话短说 - 你需要为第一非序列化父类类,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 { 
// .. 
} 
+0

这样做!谢谢。 – WildBamaBoy

2

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

由于无法控制NPC,因此请尝试创建它的子对象,该对象定义了一个显式的0参数构造函数,但是它没有实现Serializable,并查看它是否不执行它。

0

我面临与Hazelcast的序列化相同的问题,但通过使用自定义序列化解决它,而不诉诸中介类。我加了一个空的无参构造函数Animal类并实现了Person类,如下所示:

class Person extends Animal implements Serializable { 

    private void writeObject(ObjectOutputStream o) throws IOException { 
     o.writeObject(this.fieldA); 
     o.writeObject(this.fieldB); 
     o.writeObject(this.fieldC); 
     ... 
    } 

    private void readObject(ObjectInputStream o) throws IOException, ClassNotFoundException { 
     this.fieldA = (TypeOfA) o.readObject(); 
     this.fieldB = (TypeOfB) o.readObject(); 
     this.fieldC = (TypeOfC) o.readObject(); 
     ... 
    } 
} 
相关问题