在Java桌面应用程序中保留数据的最佳方法是什么?

我的桌面应用程序中有一个庞大的Java对象树,我正在尝试确定将它们作为文件保存到文件系统的最佳方法。

我曾经有过一些想法:

  • 使用DataOutputStream滚动我自己的序列化程序 :这将使我能够最大程度地控制文件中的内容,但代价是对其进行微观管理。

  • 使用ObjectOutputStream及其各种相关类的直接旧序列化 :虽然因为我发现数据很脆弱,但我没有卖掉它。 更改任何对象的结构会破坏它的序列化实例。 所以我陷入了似乎是一个可怕的版本化噩梦。

  • XML序列化 :它并不那么脆弱,但直接序列化的速度要慢得多。 它可以在我的程序之外进行转换。

  • JavaDB :我考虑过这一点,因为我很乐意编写JDBC应用程序。 这里的区别在于数据库实例仅在文件打开或保存时保持不变。 它并不漂亮但是……如果以后需要,它确实可以迁移到中央服务器架构,它引入了以更简单的方式查询数据模型的可能性。

我很想知道其他人的想法。 而且我希望我错过了一些比上面那些更明显,更简单的方法。


以下是从以下答案中剔除的更多选项:

  • 对象数据库 – 具有比ORM方法少得多的基础结构,并且比XML方法执行速度更快。 谢谢aku

db4objects可能是最好的选择

我会选择最终选项JavaDB(Sun的Derby发行版)并使用像Hibernate或iBatis这样的对象关系层。 使用前三个方法意味着您将花费更多时间来构建数据库引擎而不是开发应用程序function。

看看Hibernate是一种更简单的数据库接口方式。

根据我的经验,您最好使用嵌入式数据库。 SQL虽然不够完美,但通常比设计性能良好且可靠的文件格式容易得多。

我没有使用过JavaDB,但我对H2和SQLite运气不错。 SQLite是一个C库,在部署方面意味着更多的工作。 但是,它具有将整个数据库存储在单个跨平台库中的好处。 基本上,它是预先打包的通用文件格式。 SQLite非常有用,我甚至开始在脚本中使用它而不是文本文件。

如果你正在处理一个小的持久性问题,请小心使用Hibernate。 它增加了很多复杂性和库开销。 如果你正在使用大量的表,Hibernate非常好,但如果你只需要一些表,它可能会很麻烦。

来自codehaus.org的XStream

XML序列化/反序列化很大程度上没有编码。 您可以使用注释来调整它。 在我工作的两个项目中运作良好。

请访问http://cjugaustralia.org/?p=61查看我的用户组演示文稿

我认为这取决于你需要什么。 我们来看看选项:

1)中间贬低! 我甚至都不能certificate这一点。 🙂

2)如果你需要一个简单,快速,单方法的持久性,坚持下去。 它将保持完整的数据图原样! 要小心你要坚持持久的物体多久。 正如您自己所指出的,版本控制可能是一个问题。

3)比(2)慢,需要额外的代码,并且可以由用户编辑。 我只会使用它,数据应该被客户端用于另一种语言。

4)如果您需要以任何方式查询数据,请坚持使用数据库解决方案。

好吧,我想你已经回答了你的问题:)