什么是序列化代理模式?在哪里可以了解有关实施和使用它的更多信息?
答案 0 :(得分:21)
在Josh Bloch的 Effective Java 第二版的最后一节中有一个很好的描述。
假设您有一个类A
,您希望将其序列化。您首先声明它实现Serializable
。然后使用序列化方法writeReplace()
返回一个所谓的“序列化代理”,它将被序列化以代替A
的实例。 writeReplace()
方法不需要公开。永远不会调用A
上的默认序列化,因此可以维护A
的所有API属性。
通常,代理实现为私有静态嵌套类,它本身必须实现Serializable
(或Externalizable
以完全控制读/写过程)。因为代理是私有的,所以它的实现细节,例如具有no-arg构造函数和可变性,将被隐藏。
代理存储足够的原始对象的状态以便它可以在反序列化时重新构建对象。在反序列化时,代理使用方法readResolve()
返回A
的实例。对于单身人士来说,这可以是单身实例本身。
我写了一个详细的博客文章,其中包含示例Serializing Immutables and Singletons with a Serialization Proxy。
答案 1 :(得分:1)
有一个示例实现in this answer。