import java.io.*;
public class SuperNotSerial {
public static void main(String[] args) {
Dog d = new Dog(35, "Fido");
System.out.println("before: " + d.name + " " + d.weight);
try {
FileOutputStream fs = new FileOutputStream("testSer.ser");
ObjectOutputStream os = new ObjectOutputStream(fs);
os.writeObject(d);
os.close();
} catch (Exception e) {
e.printStackTrace();
}
try {
FileInputStream fis = new FileInputStream("testSer.ser");
ObjectInputStream ois = new ObjectInputStream(fis);
d = (Dog) ois.readObject();
ois.close();
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("after: " + d.name + " " + d.weight);
}
}
class Dog extends Animal implements Serializable {
String name;
Dog(int w, String n) {
weight = w; // inherited
name = n; // not inherited
}
}
class Animal { // not serializable !
int weight = 42;
}
即将发生的错误。
此错误是编译错误,我无法理解确切的原因
Exception in thread "main" java.lang.NoSuchMethodError: Dog.<init> (ILjava/lang/String;)V
at SuperNotSerial.main(SuperNotSerial.java:5)
答案 0 :(得分:1)
向fge回答添加缺少序列化所需的无参数构造函数。
要知道在序列化时需要无参构造函数,我们需要了解序列化发生的过程。序列化通过链接继承层次结构中的每个类,然后保存每个超类的状态直到达到第一个非序列化类来工作。
现在,当我们尝试反序列化对象时,无法从流中恢复非可序列化超类的状态(构造对象的确切状态所需的状态),而是通过调用no-arg构造函数。
当第一个非可序列化类的no-arg构造函数不可访问时,会出现问题,抛出异常'InvalidClassException:no valid constructor'。
正如我们所知,每个Java类都有一个no-arg构造函数。那么,有时候它怎么可能无法访问呢?
答案是:只有在类中没有声明其他带参数的构造函数时,才会调用默认的no-arg构造函数。在这种情况下,为了调用no-arg构造函数,我们需要单独声明它。