2012-08-25 96 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(); 
     ... 
    } 
} 
相關問題