2012-03-17 17 views
23

Kiedy biegnę poniżej programu, otrzymuję wyjątek jakojava.io.InvalidClassException: nie ważne konstruktor

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) 

Czytałem gdzieś, że kiedy dziecko jakąkolwiek klasę możemy szeregować następnie jego konstruktor klasy bazowej zostanie zwolniony.

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

proszę wybrać odpowiedź @ hej jako właściwą. – nilskp

Odpowiedz

28

Wystarczy podać domyślnego konstruktora w obu klasach (Parent & dziecko)

Podczas deserializacji, pola klas non-serializować zostanie zainicjowany za pomocą publicznych lub zabezpieczone nie-Arg konstruktor klasy . Konstruktor no-arg musi być dostępny dla podklasy nadającej się do serializacji. Pola podlegających serializacji podklas zostaną przywrócone ze strumienia. more

+1

Czy mogę znać powód, dla którego muszę to zrobić? Jaka jest koncepcja? – nitdgp

+3

Podczas dezynfekcji pola z nie nadającymi się do uśpienia warstwami zostaną uśpione przy użyciu domyślnego konstruktora. –

+0

A co, jeśli są pola "ostateczne"? – Tgsmith61591

25

Dodaj implementację Serializable do klasy nadrzędnej.

+2

To zadziałało dla mnie w Scali. Właśnie musiałem rozszerzyć 'Serializable' w klasie nadrzędnej. –

+3

Działa również w Javie. Bardzo podoba mi się ta odpowiedź, ponieważ pomaga w niezmiennych obiektach. – Basilevs

+0

Dla każdego, kto wpadł w ból głowy, który zrobiłem, w Scali, rozszerzyć dostępne 'Serializable', a nie' java.io.Serializable', aby uniknąć tego błędu :) – spiffman

Powiązane problemy