关于持久性:将数据持久保存在Java桌面应用程序中的最佳方法是什么?

关于持久性:将数据持久保存在Java桌面应用程序中的最佳方法是什么?

What's the best way to persist data in a Java Desktop Application?

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

我曾经有过一些想法:

  • 使用DataOutputStream滚动我自己的序列化器:这将使我对文件中的内容有最大的控制权,但要以微管理它为代价。

  • 使用ObjectOutputStream及其各种相关类进行的直接序列化:尽管我发现数据很脆弱,但我没有将其出售。更改任何对象的结构都会破坏它的序列化实例。因此,我陷入了可怕的版本恶梦中。

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

  • JavaDB:我考虑过这一点,因为我很喜欢编写JDBC应用程序。此处的区别在于,数据库实例仅在打开或保存文件时才会保留。它不是很漂亮,但是...的确可以在以后出现需求时迁移到中央服务器体系结构,它引入了以更简单的方式查询数据模型的可能性。

我很好奇看到别人的想法。我希望我能错过一些比上述方法更简单明了的方法。

以下是从答案中得出的一些其他选择:

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

我将使用您的最终选择JavaDB(Sun的Derby发行版),并使用对象关系层,例如Hibernate或iBatis。使用前三个方法意味着与开发应用程序功能相比,您将花费更多的时间来构建数据库引擎。


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

我没有使用JavaDB,但是我对H2和SQLite感到很幸运。 SQLite是一个C库,在部署方面意味着更多工作。但是,这样做的好处是可以将整个数据库存储在一个跨平台的库中。基本上,它是一种预打包的通用文件格式。 SQLite非常有用,以至于我什至开始使用它而不是脚本中的文本文件。

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


看看Hibernate是连接数据库的一种简单方法。


db4objects可能是最佳选择


来自codehaus.org的XStream

XML序列化/反序列化在很大程度上无需编码。
您可以使用注释对其进行调整。
在我工作的两个项目中表现良好。

在http://cjugaustralia.org/?p=61上查看我的用户组演示文稿。


我认为这取决于您的需求。让我们看一下这些选项:

1)立即描述!我什至没有理由。 :)

2)如果您需要简单,快速,一种方法的持久性,请坚持下去。它将按原样保留完整的数据图!注意要保留持久对象的时间。正如您自己指出的那样,版本控制可能是个问题。

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

4)如果仍然需要查询数据,请坚持使用数据库解决方案。

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


推荐阅读