使用更改类源代码序列化对象

时间:2013-07-28 23:47:25

标签: java serialization objectoutputstream

  

注意: 由于SO上没有这样的问题,我决定将自己作为Q& A

序列化对象(使用ObjectOutputStreamObjectInputStream)是一种将Java Object的实例存储为可以在以后反序列化以供使用的数据的方法。当用于反序列化数据的Class不能保持不变(源代码更改;程序更新)时,这可能会导致问题和挫折。

那么如何使用Object的更新/降级版本序列化和反序列化Class

1 个答案:

答案 0 :(得分:2)

以下是一些序列化对象的常用方法,这些方法可以向后兼容的方式进行反序列化。

1。使用importexport方法以JSON格式存储数据,以保存重新创建实例所需的所有字段。这可以通过包含version密钥来向后兼容,该密钥允许在版本太低时调用更新算法。一个通用的库是Google Gson库,它可以用JSON表示Java对象,也可以编辑JSON文件。

2. 以类似于上述方法的方式使用内置java Properties类。稍后可以使用作为常规Java Properties文件编写的流(store())存储属性对象,或者将其保存在XMLstoreToXML())中。

3。有时,在JSON,XML或属性文件中存储它们太复杂或不必要的地方,可以使用键值对轻松表示简单对象(过度杀人可以说)。在这种情况下,序列化对象的有效方法是使用ObjectOutputStream类来序列化包含键值对的HashMap对象,其中键可以是String,值可以是ObjectHashMap<String,Object>)。这允许存储所有对象的字段以及包括version键,同时提供多种功能。

注意:虽然使用ObjectOutputStream为持久性存储序列化对象通常被认为是不好的约定,但只要类的源代码保持不变,就可以使用它。

关于版本控制的注意事项:只要版本是兼容的更改,就可以安全地使用ObjectOutputStream中断对反序列化的更改。如Versioning of Serializable Objects chapter of the Object Serialization Specification中所述:

  

兼容变更是一项不影响合同的变更   在班级与其来电者之间。