根据Serializable javadoc,readResolve()
用于替换从流中读取的对象。但肯定(?)你没有有来替换对象,所以可以用它来恢复瞬态字段并返回原始引用,如下所示:
private Object readResolve() {
transientField = something;
return this;
}
而非使用readObject()
:
private void readObject(ObjectInputStream s) {
s.defaultReadObject();
transientField = something;
}
当用于恢复瞬态场时,有没有理由选择其他的?实际上我倾向于readResolve()
,因为它不需要参数,因此在构造“正常”时也可以很容易地使用它,在构造函数中如下:
class MyObject {
MyObject() {
readResolve();
}
...
}
答案 0 :(得分:4)
实际上,readResolve已经定义为您提供对对象反序列化方式的更高控制。因此,您可以自由地做任何您想做的事情(包括为瞬态字段设置值)。
但是,我想你的瞬态场是用一个常数值设置的。在其他地方,这肯定会出现问题:要么你的领域不是那么短暂,要么你的数据模型依赖于错误的假设。
答案 1 :(得分:4)
使用readResolve。如果格式与预期的默认值不同,则readObject方法允许您自定义对象的读取方式。这不是你想要做的。顾名思义,readResolve方法用于在读取对象后解析对象,其目的正是让您解析反序列化后未恢复的对象状态。这就是你要做的。你可以从readResolve返回“this”。