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

问题

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

仍未得到答复的问题是:

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

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


#1 热门回答(107 赞)

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


#2 热门回答(31 赞)

当1377624363从流中读取一个对象并准备将其返回给调用者时,调用了readResolve方法.ObjectInputStream检查对象的类是否定义了readResolve方法。如果定义了方法,则调用readResolve方法以允许流中的对象指定要返回的对象。返回的对象应该是与所有用途兼容的类型。如果不兼容,则会在发现类型不匹配时抛出aClassCastException


#3 热门回答(24 赞)

readResolve被调用afterreadObject已返回(相反writeReplacewriteObject之前调用,可能在另一个对象上调用)。该方法返回的对象replacesthisobject返回给用户ObjectInputStream.readObject以及对流中对象的任何进一步的后向引用。它主要用于串行代理(参见Effective Java,2nd Ed,IIRC)。