Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

java.io.InvalidClassException: no valid constructor

Tags:

java

When I run below program, I am getting exception as

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) 

I read somewhere that when we serialize any child class then its base class constructor gets fired.

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 
like image 339
nitdgp Avatar asked Mar 17 '12 05:03

nitdgp


2 Answers

Add implementation of Serializable to parent class.

like image 180
hey Avatar answered Sep 23 '22 07:09

hey


Just provide default constructor in both classes (Parent & Child)

During deserialization, the fields of non-serializable classes will be initialized using the public or protected no-arg constructor of the class. A no-arg constructor must be accessible to the subclass that is serializable. The fields of serializable subclasses will be restored from the stream. more

like image 28
jmj Avatar answered Sep 24 '22 07:09

jmj