防止Java序列化设置默认值

时间:2012-02-13 19:24:14

标签: java serialization default

我有一个包含整数foo的序列化对象MyObject。我将值10设置为整数foo,并使用writeObject()将对象保存到文件中。

我向对象MyObject添加整数条。我将值15设置为整数条,然后使用readObject()加载旧的序列化文件。

旧的可序列化文件不包含整数条,因此整数条将获得值0.如果旧的可序列化文件不包含变量条,我希望将值保留为15。

我应该覆盖readObject()还是如何阻止readObject()将“默认值”设置为未知对象?

我想这样做,因为在构造函数中我设置了自己的默认值,并希望使用我自己的默认值来控制版本控制。

3 个答案:

答案 0 :(得分:1)

是否会为MyObject工作添加以下方法?

private void readObject(ObjectInputStream ois) throws IOException, ClassNotFoundException
{
    bar = 15;  // Set a default value of 15 if it's not in the serialized output file
    ois.defaultReadObject();
}

答案 1 :(得分:1)

序列化不会设置它遵循Java的默认值初始化方案的默认值。

如果我可以总结你的问题。您希望序列化将序列化流中的内容与内存中的值合并。 Java序列化是不可能的,因为它控制要创建的对象。您可以读入序列化对象,然后手动编写代码以合并要合并的字段。如果你坚持使用Java序列化(如果我是你,我会避开它),但是假设你想继续使用它。

public class MyObject {

    public void merge( MyObject that ) {
        // given some other instance of an object merge this with that.
        // write your code here, and you can figure out the rules for which values win.
    }
}

ObjectInputStream stream = new ObjectInputStream( new FileInputStream( file ) );
MyObject that = stream.readObject();
someObject.merge( that );

Viola您可以控制将哪些字段合并到someObject中。如果您想要一个库来执行此合并,请查看http://flexjson.sourceforge.net。它使用JSON序列化,并且使用Beans而不是POJO。但是,有一种方法可以获取已填充的对象并覆盖JSON流中的值。这有一些限制。这样做的另一个好处是,在对象结构改变了Java序列化技术上可以做的事情之后,您实际上可以读回流,但这非常非常困难。

答案 2 :(得分:0)

使用关键字transient从序列化/反序列化中排除字段。