2012-03-17 59 views
23

當我運行下面的程序,我得到異常作爲java.io.InvalidClassException:沒有有效的構造

java.io.InvalidClassException: Files.SerializationMain; Files.SerializationMain; no valid constructor 
    at java.io.ObjectStreamClass.checkDeserialize(Unknown Source) 
    at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source) 
    at java.io.ObjectInputStream.readObject0(Unknown Source) 
    at java.io.ObjectInputStream.readObject(Unknown Source) 
    at Files.SerializationClass.main(SerializationClass.java:71) 
Caused by: java.io.InvalidClassException: Files.SerializationMain; no valid constructor 
    at java.io.ObjectStreamClass.<init>(Unknown Source) 
    at java.io.ObjectStreamClass.lookup(Unknown Source) 
    at java.io.ObjectOutputStream.writeObject0(Unknown Source) 
    at java.io.ObjectOutputStream.writeObject(Unknown Source) 
    at Files.SerializationClass.main(SerializationClass.java:61) 

我讀的地方,當我們系列化任何子類則其基類構造函數將被解僱。

class Parent123 
{ 
    int age; 
    String name; 

    Parent123(int age,String name) { 
     System.out.println("We are in Parent123 Constructor"); 
     this.age=age; 
     this.name=name; 
    } 
} 

class SerializationMain extends Parent123 implements Serializable { 
    int data1; 
    String data2; 

    SerializationMain(int data1,String data2) 
    { 
     super(20,"test"); 
     this.data1=data1; 
     this.data2=data2; 
    } 

    public void setData1(int data1) 
    { 
     this.data1=data1; 
    } 
    public void setData2(String data2) 
    { 
     this.data2=data2; 
    } 
    public String getData2() 
    { 
     return data2; 
    } 
    public int getData1() 
    { 
     return data1; 
    } 
} 

public class SerializationClass { 

    public static void main(String args[]) 
    { 
     System.out.println("Before Creating Object"); 
     SerializationMain s1=new SerializationMain(10,"Anurag"); 
     try 
     { 
      System.out.println("Serializing Object"); 
      FileOutputStream fis=new FileOutputStream("Test.ser"); 
      ObjectOutputStream ois=new ObjectOutputStream(fis); 
      ois.writeObject(s1); 
     } catch(Exception e1) { 
      e1.printStackTrace(); 
     } 
     try 
     { 
      FileInputStream fis=new FileInputStream("Test.ser"); 
      ObjectInputStream ois=new ObjectInputStream(fis); 
      Object o1=ois.readObject(); 
      SerializationMain s2=(SerializationMain)o1; 
     } 
     catch(Exception e1) 
     { 
      e1.printStackTrace(); 
     } 
    } 
}//End of SerializationClass 
+0

請選擇@ hey的答案是正確的。 – nilskp 2017-07-17 19:32:36

回答

28

只需提供這兩類默認的構造函數(父&兒童)

在反序列化,非序列化類的字段將使用公共初始化或保護之類的無參數的構造函數。一個無參數的構造函數必須可以訪問可序列化的子類。序列化子類的字段將從流中恢復。 more

+1

我可以知道我必須提供的原因嗎?這個概念是什麼? – nitdgp 2012-03-17 05:16:57

+3

在使用默認構造函數 – 2012-03-17 05:21:42

+0

時,將會啓動非可serilizable類的deserilization字段那裏有什麼「final」字段? – Tgsmith61591 2016-02-17 23:28:22

25

將Serializable的實現添加到父類。

+2

這在斯卡拉適合我。我只是在父類中擴展了'Serializable'。 – 2015-05-20 13:45:37

+3

也適用於Java。我更喜歡這個答案,因爲它有助於不可變的對象。 – Basilevs 2015-09-28 05:38:55

+0

對於那些遇到過我頭疼的人,在Scala中,擴展可用的'Serializable'而不是'java.io.Serializable'來避免這個錯誤:) – spiffman 2016-10-21 17:46:01

相關問題