1
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)
4

1 回答 1

1

添加到 fge 的答案是您缺少序列化所需的无参数构造函数。

要知道序列化时对无参数构造函数的需求,我们需要了解序列化发生的过程。序列化的工作方式是将继承层次结构中的每个类链接起来,然后保存每个超类的状态,直到达到第一个非序列化类。

现在,当我们尝试反序列化对象时,不可序列化超类的状态(构造对象的确切状态所必需的)无法从流中恢复,而是通过调用 no-arg 来恢复构造函数。

当第一个不可序列化类的无参数构造函数不可访问时,就会出现问题,抛出异常“InvalidClassException:没有有效的构造函数”。

正如我们所知,默认情况下,每个 Java 类都有一个无参数构造函数。那么,它怎么可能有时无法访问?

答案是:只有在类中没有声明其他带参数的构造函数时,才会调用默认的无参数构造函数。在这种情况下,为了调用无参数构造函数,我们需要单独声明它。

于 2013-06-13T06:02:31.187 回答