当我在程序下面运行时,我的异常是
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 :(得分:41)
将Serializable的实现添加到父类。
答案 1 :(得分:33)
只需在两个类(Parent&amp; Child)中提供默认构造函数
在反序列化期间,将使用类的public或protected no-arg构造函数初始化非可序列化类的字段。必须可以对可序列化的子类访问no-arg构造函数。可序列化子类的字段将从流中恢复。 more
答案 2 :(得分:3)
否,如果您使用序列化过程,则根本不会调用构造函数。 Serializable使用反射来构造对象,不需要arg构造函数。但是Externalizable需要公共的无参数构造函数。 但是,您的父类可能需要no-arg构造函数。请参考this article
一个对象是可序列化的(它自己实现Serializable接口),即使其超类不是。但是,可序列化类的层次结构中的第一个超类(不实现Serializable接口)必须具有无参数构造函数。如果违反了此要求,readObject()将在运行时生成一个java.io.InvalidClassException。
如果您使父类可序列化,或者在父类中提供公共的无参数构造函数,则不会出现此错误。