防止Java序列化设置默认值

防止Java序列化设置默认值,java,serialization,default,Java,Serialization,Default,我有一个包含整数foo的序列化对象MyObject。我将值10设置为整数foo,并使用writeObject()将对象保存到文件中 我将整型条添加到对象MyObject。我将值15设置为integer bar,然后使用readObject()加载旧的序列化文件 旧的可序列化文件不包含整型条,因此整型条将获得值0。如果旧的可序列化文件不包含变量bar,我希望将值15保留在bar中 我应该重写readObject()还是如何防止readObject()将“默认值”设置为未知对象 我之所以要这样做,是

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

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

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

我应该重写readObject()还是如何防止readObject()将“默认值”设置为未知对象


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

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

将以下方法添加到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();
}

序列化不设置默认值,它遵从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您可以控制哪些字段将从该字段合并到某个对象中。如果希望库为您执行此合并,请签出。它使用JSON序列化,并从bean而不是POJO工作。但是,有一种方法可以获取已填充的对象并覆盖JSON流中的值。这是有局限性的。另一个好处是,在对象结构改变了Java序列化在技术上可以做的事情之后,您实际上可以读回流,但这非常困难。

我想对bar进行序列化和反序列化。如果反序列化内容中不存在bar,我只是不希望应用默认的反序列化值。@user1207523,然后只需在
readObject
方法(或
readResolve()
)中实现此类逻辑即可。实际上,它不会在read中被重写。虽然这对我来说很有效,因为酒吧不可能是零。ois.defaultReadObject();如果(巴=0)巴=15;非常感谢。我仍然希望我们能找到一个更好的答案。我要么依赖于这里未定义的行为(很可能),要么做一些与你不同的事情。在我的测试中(在将bar添加到类之前使用序列化对象文件),读取并没有覆盖该值,最终得到15。只有当我的序列化对象文件首先包含一个条时,它才会覆盖它。希望你能找到更好的答案。谢谢,这是个好答案。我很高兴我没有陷入序列化。你有什么建议?我需要一种将对象存储为文件的方法,并对其进行良好的版本控制。如果长期存储是您的目标,我肯定会说使用flexjson之类的东西。您始终可以使用所需的任何对象结构读回数据。如果没有相同的对象和包结构,Java序列化要困难得多,几乎是不可能的。每当我尝试将Java序列化用于长期存储时,我最终都会将其删除并替换。