1

来自 Effective Java 的序列化章节:

如果正在反序列化的对象的类定义了带有正确声明的 readResolve 方法,则在反序列化后新创建的对象上调用此方法。

Effective Java 中提供的示例如下, Javadoc所说的正确格式似乎throws缺少该部分,即ANY-ACCESS-MODIFIER Object readResolve() throws ObjectStreamException;

 // readResolve for instance control - you can do better!
        private Object readResolve () {
            // Return the one true Elvis and let the garbage collector
            // take care of the Elvis impersonator.
            return INSTANCE;
        }

这里的正确声明是什么意思?如果声明不正确,该类甚至会编译吗?我发现这句话有点令人困惑。

4

2 回答 2

5

来自 javadocSerializable

当从流中读取实例时需要指定替换的类应该使用精确的签名实现这个特殊方法。

ANY-ACCESS-MODIFIER 对象 readResolve() 抛出 ObjectStreamException;

所以proper declaration意味着该方法必须具有与上述相同的声明。

存在这种行为是因为

Serializable 充当 JRE/JVM 的标记,它可以根据它的存在采取行动。

但是没有任何自己声明的抽象方法。

于 2013-09-08T17:38:43.223 回答
2

正确的声明意味着方法必须有这个签名:

Object readResolve() throws ObjectStreamException;

在反序列化过程中,对象 T 成功反序列化后,如果对象 T 包含如上声明的方法 readResolve()(当然是通过反射),它会被自动调用。
这个教程或者官方文档

于 2013-09-08T17:40:53.070 回答