gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:28:36 25 4
gpt4 key购买 nike

Note: Due to the lack of questions like this on SO, I've decided to put one up myself as a Q&A

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

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

最佳答案

这里有几种常见的序列化对象的方法,这些对象可以以向后兼容的方式反序列化。

1. 将数据存储在JSON中格式使用 importexport旨在保存重新创建实例所需的所有字段的方法。这可以通过包含 version 来实现向后兼容。如果版本太低,允许调用更新算法的 key 。一个通用的库是 Google Gson可以在 JSON 中表示 Java 对象以及正常编辑 JSON 文件的库。

2. 使用内置java Properties以类似于上述方法的方式进行分类。 Properties 对象可以在以后使用流 ( store() ) 存储,编写为常规 Java Properties 文件,或保存在 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 中所述:

A compatible change is a change that does not affect the contract between the class and its callers.

关于java - 使用更改的类源代码序列化对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17914197/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com