Java serialization: readObject() vs. readResolve()

2022-08-31 07:52:16

Effective Java》一书和其他来源很好地解释了在使用可序列化的Java类时如何以及何时使用该方法。另一方面,这种方法仍然有点神秘。基本上,我发现的所有文件要么只提到两者中的一个,要么只单独提到两者。readObject()readResolve()

尚未回答的问题是:

  • 这两种方法有什么区别?
  • 何时应实现哪种方法?
  • 应该如何使用,特别是在退货方面?readResolve()

我希望你能对这个问题有所了解。


答案 1

readResolve用于替换从流中读取的对象。我见过的唯一用途是强制执行单例;读取对象时,将其替换为单例实例。这可确保没有人可以通过序列化和反序列化单例来创建另一个实例。


答案 2

项目90,有效的Java,第3版封面和串行代理 - 它们的主要用途。这些示例不写出和方法,因为它们使用默认序列化来读取和写入字段。readResolvewriteReplacereadObjectwriteObject

readResolve在返回后调用(相反,在返回之前调用,可能在另一个对象上调用)。该方法返回的对象将替换返回给用户的对象以及对流中该对象的任何进一步反向引用。两者都可能返回相同或不同类型的对象。在某些情况下,返回相同的类型很有用,在这些情况下,字段必须是必需的,并且需要向后兼容性,或者必须复制和/或验证值。readObjectwriteReplacewriteObjectthisObjectInputStream.readObjectreadResolvewriteReplacefinal

使用 不会强制实施单例属性。readResolve