假设一个简单的可序列化对象,如下所示:
public class MySerializable implements Serializable{
String value;
transient String test = "default";
public MySerializable() {
test = "init";
}
}
如果序列化和反序列化的实例,变量test
仍为null
。我的方法是编写一个这样的新方法:
private String getTest(){
test = test==null?"default":test;
return test;
}
每次调用test
变量时调用它。
有更好的(更漂亮的)解决方案吗?
答案 0 :(得分:4)
来自Serializable
的文档:
在序列化和反序列化过程中需要特殊处理的类必须使用这些精确签名实现特殊方法:
private void writeObject(java.io.ObjectOutputStream out) throws IOException private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException; private void readObjectNoData() throws ObjectStreamException;
[...]
readObject
方法负责从流中读取并恢复类字段。它可以调用in.defaultReadObject
来调用恢复对象的非静态和非瞬态字段的默认机制。defaultReadObject
方法使用流中的信息来分配流中保存的对象的字段以及当前对象中相应命名的字段。这处理了类在演变为添加新字段时的情况。该方法不需要关注属于其超类或子类的状态。通过使用ObjectOutputStream
方法或使用writeObject
支持的原始数据类型的方法将单个字段写入DataOutput
来保存状态。
所以基本上,我认为你想要:
public class MySerializable implements Serializable{
String value;
transient String test = "default";
public MySerializable() {
test = "init";
}
private void readObject(java.io.ObjectInputStream in)
throws IOException, ClassNotFoundException {
in.defaultReadObject();
test = "init";
}
}