我有一个包含整数foo的序列化对象MyObject。我将值10设置为整数foo,并使用writeObject()将对象保存到文件中。
我向对象MyObject添加整数条。我将值15设置为整数条,然后使用readObject()加载旧的序列化文件。
旧的可序列化文件不包含整数条,因此整数条将获得值0.如果旧的可序列化文件不包含变量条,我希望将值保留为15。
我应该覆盖readObject()还是如何阻止readObject()将“默认值”设置为未知对象?
我想这样做,因为在构造函数中我设置了自己的默认值,并希望使用我自己的默认值来控制版本控制。
答案 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
从序列化/反序列化中排除字段。