注意: 由于在 SO 上没有这样的问题,我决定自己提出一个 Q&A
序列化对象(使用 anObjectOutputStream
和 an ObjectInputStream
)是一种将 a 的实例存储Java Object
为数据的方法,以后可以反序列化以供使用。当Class
用于反序列化数据的方法不保持不变(源代码更改;程序更新)时,这可能会导致问题和挫败感。
那么如何Object
使用 a 的更新/降级版本对 a 进行序列化和反序列化Class
?
注意: 由于在 SO 上没有这样的问题,我决定自己提出一个 Q&A
序列化对象(使用 anObjectOutputStream
和 an ObjectInputStream
)是一种将 a 的实例存储Java Object
为数据的方法,以后可以反序列化以供使用。当Class
用于反序列化数据的方法不保持不变(源代码更改;程序更新)时,这可能会导致问题和挫败感。
那么如何Object
使用 a 的更新/降级版本对 a 进行序列化和反序列化Class
?
以下是序列化对象的几种常用方法,这些对象可以以向后兼容的方式反序列化。
1.使用旨在保存重新创建实例所需的所有字段的方法以JSON格式存储数据。这可以通过包含一个允许在版本太低时调用更新算法的密钥来实现向后兼容。一个常见的库是Google Gson库,它可以在 JSON 中表示 Java 对象以及通常编辑 JSON 文件。import
export
version
2.使用内置的java Properties类,方法与上述方法类似。属性对象可以在以后使用store()
写成常规 Java 属性文件的流 ( ) 存储,或者保存在XML ( storeToXML()
) 中。
3.有时简单的对象可以很容易地用键值对表示,在一个地方,将它们存储在 JSON、XML 或属性文件中要么太复杂,要么没有必要(有人可能会说矫枉过正)。在这种情况下,序列化对象的一种有效方法是使用ObjectOutputStream类来序列化HashMap
包含键值对的对象,其中键可以是 a String
,值可以是Object
( HashMap<String,Object>
)。这允许存储对象的所有字段以及包括一个version
键,同时提供更多的多功能性。
注意:虽然使用ObjectOutputStream
持久存储序列化对象通常被认为是不好的约定,但只要类的源代码保持不变,它就可以使用任何一种方式。
另请注意版本控制:ObjectOutputStream
只要是兼容的更改,就可以安全地对类进行更改而不会破坏反序列化。如对象序列化规范的可序列化对象的版本控制一章中所述:
兼容更改是不影响类与其调用者之间的契约的更改。