java.io.InvalidClassException:没有有效的构造函数

当我在程序下面运行时,我会遇到exception

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.(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 

将Serializable的实现添加到父类。

只需在两个类中提供默认构造函数(Parent&Child)

在反序列化期间,将使用类的public或protected no-arg构造函数初始化非可序列化类的字段。 必须可以对可序列化的子类访问no-arg构造函数。 可序列化子类的字段将从流中恢复。 更多

不,如果使用序列化过程,则根本不会调用构造函数。 Serializable使用reflection来构造对象,并且不需要arg构造函数。 但Externalizable需要公共的无参数构造函数。 但是,您的父类可能需要no-arg构造函数。请阅读本文

对象是可序列化的(本身实现了Serializable接口),即使它的超类不是。 但是,可序列化类的层次结构中的第一个超类(不实现Serializable接口)必须具有无参数构造函数。 如果违反了此规则,readObject()将在运行时生成java.io.InvalidClassException。

如果您使父类可序列化或者在父类中提供public no-arg构造函数,则不会出现此错误。