可靠存储复杂 Java 对象层次结构的最佳方法是什么?
What is the best way to reliable store a complex Java object hierarcy?
我目前正在开发一种软件,用户可以在其中将复杂的对象层次结构定义为设置。
此外,此设置对象将为其他开发人员提供作为 API 的接口。
现在我想存储这些设置并重新加载它。
我目前正在考虑不同的方法来做到这一点,但我认为 none 的解决方案是 "good"。
主要目标应该是:
- 它应该输出一个字符串,因为我更喜欢人类可读的配置而不是快速的配置。
- 它应该可靠,即使 代码正在更改。这意味着它不应该变魔术,但很明显,更改可能会破坏已存储的配置。 (例如,我如何防止我的同事重命名 class 并破坏生产。)
- 存储和加载应该与 o对象、接口和泛型一起工作。
- 保持存储内容的配置尽可能低。我更喜欢约定而不是配置。
我知道你们中的许多人在开发过程中都遇到过相同或类似的问题。
那么您的解决方案是什么?您使用了哪个框架,为什么?
我想出的所有解决方案要么不可靠,要么配置庞大,要么代码太多。
所以我期待着从你们所有人那里得到关于这个话题的一些好的新观点。
谢谢。
我建议指定 XSD 并使用 JAXB 生成 Java 类 以及编组和解编基于 XML 的设置文件。
确保根标签包含 XSD 的版本。如果需要支持多个版本,可以先使用 StAX 读取版本,确定 JAXB 的正确版本类。
我会推荐 XStream。在没有任何配置的情况下,它具有与 java.io.*ObjectStream
类似的功能,但输出 XML 而不是二进制 blob。您只想为 class 个名称添加几个别名以使文件更具可读性。
有关我现在如何解决此问题的更多信息:
我使用 Gson 将对象层次结构序列化为 JSON。添加了一个 Generic TypeAdapter 用于序列化和反序列化所有已知的接口。此适配器将 class 名称保存到 JSON 对象中,并在反序列化时构造此 class。除了为每个使用的接口注册此 TypeAdapter 之外,不需要其他配置。
为了使其可靠,我将向项目添加一个单元测试,以反序列化完整的可能配置。所以对代码的任何更改都会破坏测试。
这样我就可以满足上面提到的所有点了。
希望对大家有所帮助。
我目前正在开发一种软件,用户可以在其中将复杂的对象层次结构定义为设置。 此外,此设置对象将为其他开发人员提供作为 API 的接口。 现在我想存储这些设置并重新加载它。
我目前正在考虑不同的方法来做到这一点,但我认为 none 的解决方案是 "good"。
主要目标应该是:
- 它应该输出一个字符串,因为我更喜欢人类可读的配置而不是快速的配置。
- 它应该可靠,即使 代码正在更改。这意味着它不应该变魔术,但很明显,更改可能会破坏已存储的配置。 (例如,我如何防止我的同事重命名 class 并破坏生产。)
- 存储和加载应该与 o对象、接口和泛型一起工作。
- 保持存储内容的配置尽可能低。我更喜欢约定而不是配置。
我知道你们中的许多人在开发过程中都遇到过相同或类似的问题。
那么您的解决方案是什么?您使用了哪个框架,为什么?
我想出的所有解决方案要么不可靠,要么配置庞大,要么代码太多。
所以我期待着从你们所有人那里得到关于这个话题的一些好的新观点。
谢谢。
我建议指定 XSD 并使用 JAXB 生成 Java 类 以及编组和解编基于 XML 的设置文件。
确保根标签包含 XSD 的版本。如果需要支持多个版本,可以先使用 StAX 读取版本,确定 JAXB 的正确版本类。
我会推荐 XStream。在没有任何配置的情况下,它具有与 java.io.*ObjectStream
类似的功能,但输出 XML 而不是二进制 blob。您只想为 class 个名称添加几个别名以使文件更具可读性。
有关我现在如何解决此问题的更多信息:
我使用 Gson 将对象层次结构序列化为 JSON。添加了一个 Generic TypeAdapter 用于序列化和反序列化所有已知的接口。此适配器将 class 名称保存到 JSON 对象中,并在反序列化时构造此 class。除了为每个使用的接口注册此 TypeAdapter 之外,不需要其他配置。
为了使其可靠,我将向项目添加一个单元测试,以反序列化完整的可能配置。所以对代码的任何更改都会破坏测试。
这样我就可以满足上面提到的所有点了。
希望对大家有所帮助。