根据Serializable javadoc,readResolve()
用于替换从流中读取的对象。但是可以肯定(?)不必替换对象,因此可以使用它来还原 transient 字段并返回原始引用,如下所示:
private Object readResolve() {
transientField = something;
return this;
}
而不是使用
readObject()
:private void readObject(ObjectInputStream s) {
s.defaultReadObject();
transientField = something;
}
当仅用于恢复 transient 字段时,是否有任何理由选择一个?实际上,我倾向于
readResolve()
,因为它不需要参数,因此在“正常”构造对象时也可以轻松使用它,例如:class MyObject {
MyObject() {
readResolve();
}
...
}
最佳答案
实际上,已经定义了readResolve以为您提供反序列化对象的方式的更高控制权。因此,您可以随意做任何想做的事情(包括为 transient 字段设置值)。
但是,我想您的 transient 字段设置为一个恒定值。在其他地方,这肯定是有问题的迹象:您的字段不是那么短暂,或者您的数据模型依赖于错误的假设。
关于java - readObject()与readResolve()还原临时字段,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2801206/