重新初始化瞬态变量的正确方法

时间:2013-09-19 11:11:02

标签: java serialization

假设一个简单的可序列化对象,如下所示:

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变量时调用它。

有更好的(更漂亮的)解决方案吗?

1 个答案:

答案 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";
    }
}