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构造函数,则不会出现此错误。
- java.lang.IllegalStateException:初始化之前使用的Orca SharedPreferences
- 在Android中阅读seekarc位置值
- 不能在Android中使用带有Java 1.8的lambda函数
- Google App Engine和SQL LIKE
- 使用GWT和GAE进行JUnit测试
- GAE部署Java8 / Java7错误
- java.lang.NullPointerException:尝试在空对象引用上调用虚方法’android.view.View android.view.View.findViewById(int)’
- 将hex答案转换为十二月?
- 在循环中更改图像 – Android