【问题标题】:Opensource library to save tree of java objects to db or file将 java 对象树保存到数据库或文件的开源库
【发布时间】:2011-11-24 09:35:57
【问题描述】:

我正在寻找一个开源库,它可用于透明地将 java 对象(及其依赖项!)保存到文件或数据库,一种快照。

示例用例:我在一堆对象、玩家、分数、位置等中有一个游戏的状态。用户点击“保存”,现在我需要保存这些对象(所有要保存的对象都可以注释)到文件或数据库。如果系统崩溃或用户稍后登录,我应该能够从这一点恢复。

我正在寻找一个可以尽可能透明和高效地执行此操作的库。交易等是不必要的。 我的优先事项是

  1. 开源,免费,良好的文档
  2. 易于使用。用户应 修改后不必手动保存对象。的 如果(她)必须这样做,那应该是微不足道的活动
  3. 稳定
  4. 应该 易于从快照中读取和恢复。

是否存在涵盖所有 4 个或至少大部分上述 req 的库?我对面向方面的方法持开放态度

我是否为我的用例询问了错误的 q?它在行业中的做法有很大不同吗?

【问题讨论】:

    标签: java serialization nosql object-oriented-database


    【解决方案1】:

    您可以使用标准的 java 序列化机制。如果您要保存的所有类都实现标记接口Serializable,您可以透明地保存您想要的对象图。它不是数据库,它是文件,但您始终可以将这些对象读回您的应用程序,这可能是您的最佳(或第一个)选项。

    此方法的缺点是数据是二进制的,即您无法使用记事本读取它。并且格式对类中所做的更改非常敏感,因此对向后/向前兼容性的支持是有问题的。

    其他可能性是将对象序列化为 XML 或 JSON。对于 XML,请尝试 JAXB 或 XStream。对于 JSON,请查看 here

    【讨论】:

    • JSon 似乎是一个不错的选择。我可以将这种图保存到 nosql db 中,比如 mongodb,然后快速读回来。这是个好方法吗?
    【解决方案2】:

    您应该能够使用 java 的内置序列化来解决这个问题。如果您希望它自动保存,请将您的模型包装在一个为您保存它的层中。这甚至可以使用代理(java.lang.reflect.Proxy)“自动”完成。

    但是,我通常不建议自动保存状态,因为值通常是相关的。想象一下一个进度类,它会跟踪您所处的级别以及您在该级别中的进度(例如 0%、25%、50% 和 75%)。

    现在,您刚刚完成第 2 级,因此必须将进度更新为“第 3 级,0%”。如果您首先设置级别,进度将(在短时间内)处于“级别 3,75%”状态,这是不正确的,如果您先设置多远,您将获得“级别 2,0%”。如果程序在其中任何一个点停止,那么用户的状态就会不正确。

    【讨论】:

    • java游戏服务器是这样的吗?序列化对象图,保存(手动)。重新加载它。
    • 状态以某种方式被序列化,要么通过一些内置机制,要么通过其他一些逻辑(为了稳定性,我认为后者更常见)。您所说的“手动”保存是什么意思?不一定是用户按下保存按钮,可能是您的程序每 x 分钟保存一次状态或在游戏中执行特定任务。为什么需要重新加载? (我可以理解在你去的时候保存它,如果你想进入一个旧的状态就加载它,但是立即保存-重新加载它?)
    • 我不想立即重新加载它。通过手动,我实际上是指程序员必须在每次更新 POJO 后手动编写保存部分。而不是由 aop 或某些此类解决方案透明地处理。但就像你说的那样,这可能会导致状态不一致并且是个坏主意。
    【解决方案3】:

    有一个名为 ObjectInput/ObjectOutput-Stream 的内置功能。

    http://docs.oracle.com/javase/6/docs/api/java/io/ObjectInputStream.html

    如果你喜欢人类可读的文件,你可能喜欢使用 XStream。

    http://x-stream.github.io/faq.html

    【讨论】:

      猜你喜欢
      • 2017-10-25
      • 1970-01-01
      • 2012-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-26
      相关资源
      最近更新 更多