2

http://docs.oracle.com/javase/6/docs/api/java/io/Serializable.html上详细说明 Serializable 的文档

“为了允许不可序列化类的子类型被序列化,子类型可以承担保存和恢复超类型的公共、受保护和(如果可访问)包字段的状态的责任。子类型可以承担这个责任,只有当它的类extends 有一个可访问的无参数构造函数来初始化类的状态。如果不是这种情况,则声明类 Serializable 是错误的。将在运行时检测到该错误。

一般来说,任何具有私有构造函数的类都不能扩展。并且此错误将在编译时可见。但是上述文档的最后一行说它将在运行时发生。有什么解释吗?

4

2 回答 2

3

该文档说不可序列化的超类型需要一个无参数的构造函数。它并没有说它应该是私有的。相反,它说这个构造函数应该是可访问的。文档关于运行时的含义是这样的

class A {
    A() {   <-- accessible only in current package
    }
}

public class B extends A implements Serializable {
    public B() {
    }
}

让我们假设 A 和 B 都在同一个包中。没有编译错误。但是,如果我们尝试从另一个包中的类 C 反序列化 B 的实例,我们将得到一个运行时异常,因为 ObjectInputStream 将尝试调用 A 的无参数构造函数,但它无法从包外部访问

于 2013-07-29T10:45:50.670 回答
1

您的最后一部分解释不正确。A 的无参数构造函数是否对 C 可见并不重要。它只需要对 B 可见。

简而言之,只要 A 有一个对 B 可见的无参数构造函数,B 就可以被声明为可序列化的。

但是原版还是开着的:

为什么在编译时所有验证信息都可用时在运行时识别出此错误?

于 2013-09-19T16:33:33.950 回答