2

假设一个简单的可序列化对象是这样的:

public class MySerializable implements Serializable{
    String value;
    transient String test = "default";

    public MySerializable() {
        test = "init";
    }
}

如果 this 的一个实例被序列化和反序列化,变量test仍然是null. 我的方法是编写一个像这样的新方法:

private String getTest(){
    test = test==null?"default":test;
    return test;
}

并在每次调用test变量时调用它。

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

4

1 回答 1

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";
    }
}
于 2013-09-19T11:13:17.130 回答