注意: 由于SO上没有这样的问题,我决定将自己作为Q& A
序列化对象(使用ObjectOutputStream
和ObjectInputStream
)是一种将Java Object
的实例存储为可以在以后反序列化以供使用的数据的方法。当用于反序列化数据的Class
不能保持不变(源代码更改;程序更新)时,这可能会导致问题和挫折。
那么如何使用Object
的更新/降级版本序列化和反序列化Class
?
答案 0 :(得分:2)
以下是一些序列化对象的常用方法,这些方法可以向后兼容的方式进行反序列化。
1。使用import
和export
方法以JSON格式存储数据,以保存重新创建实例所需的所有字段。这可以通过包含version
密钥来向后兼容,该密钥允许在版本太低时调用更新算法。一个通用的库是Google Gson库,它可以用JSON表示Java对象,也可以编辑JSON文件。
2. 以类似于上述方法的方式使用内置java Properties类。稍后可以使用作为常规Java Properties文件编写的流(store()
)存储属性对象,或者将其保存在XML(storeToXML()
)中。
3。有时,在JSON,XML或属性文件中存储它们太复杂或不必要的地方,可以使用键值对轻松表示简单对象(过度杀人可以说)。在这种情况下,序列化对象的有效方法是使用ObjectOutputStream类来序列化包含键值对的HashMap
对象,其中键可以是String
,值可以是Object
(HashMap<String,Object>
)。这允许存储所有对象的字段以及包括version
键,同时提供多种功能。
注意:虽然使用ObjectOutputStream
为持久性存储序列化对象通常被认为是不好的约定,但只要类的源代码保持不变,就可以使用它。
关于版本控制的注意事项:只要版本是兼容的更改,就可以安全地使用ObjectOutputStream
中断对反序列化的更改。如Versioning of Serializable Objects chapter of the Object Serialization Specification中所述:
兼容变更是一项不影响合同的变更 在班级与其来电者之间。