java.io.InvalidClassException: no valid constructor
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
Solution 1:
Add implementation of Serializable to parent class.
Solution 2:
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
Solution 3:
No, constructors are not at all called if you use Serialization process. Serializable uses reflection to construct object and does not require no arg constructor. But Externalizable requires public no-arg constructor. however, you parent class may require no-arg constructor.refer this article
An object is serializable (itself implements the Serializable interface) even if its superclass is not. However, the first superclass in the hierarchy of the serializable class, that does not implements Serializable interface, MUST have a no-arg constructor. If this is violated, readObject() will produce a java.io.InvalidClassException in runtime.
you wouldn't get this error if you make the parent class serializable or if you provide public no-arg constructor in parent class.