Java 序列化:readObject() 与 readResolve()

新手上路,请多包涵

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

尚未回答的问题是:

  • 这两种方法有什么区别?
  • 应该在什么时候实施哪种方法?
  • readResolve() 应该如何使用,尤其是在返回什么方面?

我希望你能对这件事有所了解。

原文由 Forage 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 746
2 个回答

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

原文由 Michael Myers 发布,翻译遵循 CC BY-SA 2.5 许可协议

第 90 项,Effective Java,第 3 版涵盖了 readResolvewriteReplace 用于串行代理 - 它们的主要用途。这些示例没有写出 readObjectwriteObject 方法,因为它们使用默认序列化来读取和写入字段。

readResolve is called after readObject has returned (conversely writeReplace is called before writeObject and probably on a different object).该方法返回的对象替换了 this 返回给用户的对象 ObjectInputStream.readObject 以及对流中对象的任何进一步反向引用。 readResolvewriteReplace 可能返回相同或不同类型的对象。在字段必须是 final 并且需要向后兼容性或必须复制和/或验证值的情况下,返回相同类型很有用。

使用 readResolve 不强制执行单例属性。

原文由 Tom Hawtin - tackline 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题