2012-03-17 56 views
23

Khi tôi chạy bên dưới chương trình, tôi nhận được ngoại lệ nhưjava.io.InvalidClassException: không có nhà xây dựng có giá trị

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) 

Tôi đọc ở đâu đó rằng khi chúng ta serialize bất kỳ lớp con sau đó constructor lớp cơ sở của nó bị sa thải.

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

vui lòng chọn câu trả lời của @ hey làm câu trả lời đúng. – nilskp

Trả lời

28

Chỉ cần cung cấp constructor mặc định trong cả hai lớp (Parent & Child)

Trong deserialization, các lĩnh vực của các tầng lớp phi serializable sẽ được khởi tạo sử dụng công hoặc bảo vệ không-arg constructor của lớp . Một constructor no-arg phải được truy cập tới lớp con có thể tuần tự hóa được. Các trường lớp con có thể tuần tự hóa sẽ được khôi phục từ luồng. more

+1

Tôi có thể biết lý do tại sao tôi phải cung cấp. Khái niệm là gì? – nitdgp

+3

Trong các trường deserilization của lớp không serilizable sẽ được initilized bằng cách sử dụng constructor mặc định –

+0

Điều gì về khi có 'final' lĩnh vực? – Tgsmith61591

25

Thêm triển khai Serializable cho lớp cha.

+2

Điều này làm việc cho tôi ở Scala. Tôi chỉ cần mở rộng 'Serializable' trong lớp cha. –

+3

Hoạt động trong Java. Tôi thích câu trả lời này nhiều hơn, bởi vì nó giúp cho những vật không thay đổi được. – Basilevs

+0

Đối với bất kỳ ai chạy vào cơn đau đầu mà tôi đã làm, trong Scala, mở rộng 'Serializable' có sẵn và không' java.io.Serializable' để tránh lỗi này :) – spiffman

Các vấn đề liên quan