2012-03-17 1 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

ответ

28

Просто обеспечивают конструктор по умолчанию в обоих классах (Родитель & ребенка)

Во время десериализации поля несериализуемых классов будут инициализированы с помощью общественности или не защищен конструктор без аргументов класса , Конструктор no-arg должен быть доступен для подкласса, который является сериализуемым. Поля сериализуемых подклассов будут восстановлены из потока. more

+1

Могу ли я узнать причину, по которой я должен предоставить. Что такое концепция? – nitdgp

+3

Во время десериализации поля класса без serilizable будут инициализированы с использованием конструктора по умолчанию –

+0

Что делать, когда есть поля 'final'? – Tgsmith61591

25

Добавить реализацию Serializable в родительский класс.

+2

Это работало для меня в Скале. Мне просто пришлось расширять «Serializable» в родительском классе. –

+3

Работает на Java тоже. Мне больше нравится этот ответ, потому что он помогает неизменным объектам. – Basilevs

+0

Для всех, кто столкнулся с головной болью, которую я сделал, в Scala, расширьте доступную 'Serializable', а не' java.io.Serializable', чтобы избежать этой ошибки :) – spiffman

Смежные вопросы