什么是可靠存储复杂Java对象层次结构的最佳方法?

时间:2015-07-24 11:11:49

标签: java json serialization configuration persistence

我目前正在开发一种软​​件,用户可以将复杂的对象层次结构定义为设置。 此设置对象还将为其他开发人员提供接口作为API。 现在我想存储这些设置并重新加载它。

我目前正在考虑采用不同的方法来做到这一点,但我的解决方案都不是"好的"在我看来。

主要目标应为:

  1. 它应该输出一个字符串,因为我更喜欢人类可读的配置而不是快速的配置。
  2. 即使代码正在更改,也应该可靠。这意味着它不应该做魔术,但显而易见的是,更改可能会破坏已存储的配置。 (例如。如何防止我的同事重命名课程并破坏生产。)
  3. 存储和加载应与o 对象,接口和泛型一起使用。
  4. 保持配置的内容尽可能低。我希望约定优于配置
  5. 我知道很多人在开发过程中遇到过相同或类似的问题。

    那么你的解决方案是什么?您使用了哪个框架?为什么?

    我提出的所有解决方案要么不依赖,要么是庞大的配置,要么是代码很多。

    所以我期待着从你们所有人那里获得一些关于这个主题的新观点。

    感谢。

3 个答案:

答案 0 :(得分:1)

我建议指定一个XSD并使用JAXB生成Java类,并编组和解组基于XML的设置文件。

确保根标记包含XSD的版本。如果需要支持多个版本,可以使用StAX首先读取版本并确定正确版本的JAXB类。

答案 1 :(得分:1)

我会推荐XStream。没有任何配置,它具有与java.io.*ObjectStream类似的功能,但输出XML而不是二进制blob。您只需要为类名添加一些别名,以使文件更具可读性。

答案 2 :(得分:0)

有关详细信息,我现在如何解决这个问题:

我使用Gson将对象层次结构序列化为JSON。添加了Generic TypeAdapter,用于序列化和反序列化所有已知接口。此适配器将类名保存到JSON对象中,并在反序列化时构造此类。除了为每个使用的接口注册此TypeAdapter之外,不需要其他配置。

为了使其可靠,我将向项目添加单元测试,以反序列化完整的可能配置。因此,对代码的任何更改都将破坏测试。

通过这种方式,我可以实现上述所有要点。

我希望这对任何人都有帮助。