什么是轻量级选项,可用于Java对象的持久化?

15

有哪些轻量级的选项可以用来持久化Java对象?

我正在寻找最简单的解决方案。我不需要任何花哨的功能,只需要一些适用于比较简单的对象(例如集合、关系和简单继承),并且不会给现有代码库带来太多明显的复杂性。

我知道的选项包括Hibernate和EMF等框架,但它们听起来太复杂,而且耗时。我希望有一个开箱即用的东西,最好是面向文件而不是面向数据库,我可以将其放在我的普通Java对象之上。

这是一个新手问题,感谢提前提供类似教程般的、澄清上下文的指导。

10个回答

9

db4o 是一种对象数据库,因此无需设置模式,并且能够很好地适应对象结构随时间变化的情况。


1
我真的很喜欢db4o,它非常好用和简单。 - Fabian Steeg
不幸的是,db4o已经停止维护了。http://supportservices.actian.com/versant/default.html - FoxyBOA

6
如果您正在寻找简单的东西,您可能也希望数据以可读格式(而不是二进制文件或数据库)呈现。如果是这种情况,您应该查看JAXB(Java的XML绑定),它是Java 6及更高版本的一部分。还有其他技术可能能够更好地完成此任务,例如XML Beans,但这个内置的技术是比较容易操作的。
请查看Java API中的此页面。将Java对象序列化和反序列化非常简单明了。

http://java.sun.com/javase/6/docs/api/javax/xml/bind/JAXBContext.html

基本上您使用以下内容:

    JAXBContext jc = JAXBContext.newInstance( "com.acme.foo" );

    // unmarshal from foo.xml
    Unmarshaller u = jc.createUnmarshaller();
    FooObject fooObj = (FooObject)u.unmarshal( new File( "foo.xml" ) );

    // marshal to System.out
    Marshaller m = jc.createMarshaller();
    m.marshal( fooObj, System.out );

只需确保您的FooObject具有@XmlRootElement注释。 Java bean属性会自动解释,但您可以使用其他注释来控制XML的外观并对更复杂的对象进行建模。


相当不错。我之前不知道这个。 - Allain Lalonde
你看过Xstream吗?它更简单一些。 - Milhous

5

ObjectOutputStream和ObjectInputStream可以实现这个功能。它们是Java内置的,可以很容易地序列化/反序列化对象。

这些工具的不好之处在于,如果你更改了对象,就无法导入现有的旧对象。你需要想办法与可能已保存在用户计算机上的现有对象保持兼容,例如为你的类添加版本号,并创建将旧对象转换为新对象的能力。

更多信息请参见此处:

编辑: 您也可以考虑立即将以下属性添加到所有类中。这可能允许您向类添加属性,仍然能够加载旧的Object文件。在RMI领域中,这是有效的,但我不确定文件是否也适用。不要删除属性。

static final long serialVersionUID = 1L;

4
尝试使用简单的XML持久化http://simple.sourceforge.net。它非常简单,不需要配置。只需使用现有的POJO进行注释,然后就可以将它们读写到文件中。支持循环对象图以及所有Java集合。可以像这样使用。
Serializer serializer = new Persister();
MyObject object = serializer.read(MyObject.class, new File("file.xml));

同时编写也同样简单

serializer.write(myInstance, new File("file.xml"));

这是一种非常轻量级的方法,除了标准Java 1.5之外没有任何依赖项。与其他对象到XML技术(如JAXB、XStream、Castor)相比,这些技术依赖于许多其他项目,Simple XML非常轻巧且内存效率高。


3

3
您可以尝试使用开源库XStream,它可以将您的POJO转换为XML格式并保存到磁盘。使用起来非常简单,只需要几行代码即可。

2

序列化的唯一问题是,如果您对对象进行任何更改,它就会彻底失败。 - Milhous
如果您在类中添加serialVersionUID,则至少可以添加属性。 您仍然无法删除属性。 使用Java附带的serialver工具查找您的类当前具有的serialVersionUID。 - Sarel Botha

1
我知道的最简单的选项是使用Xstream将任何Java对象转换为XML文件。

0

我在生产代码中广泛使用PersistentObject,它完全满足我的需求。


0

我必须说,Hibernate 的初始学习曲线相对较浅。你应该能够在不到一天的时间内建立一个测试系统。只有当你想要更高级的功能时,它才开始变得更加陡峭。我强烈建议你一定要看看,毕竟如果最终不选择它,那么一天又算什么呢?

话虽如此,如果你只是想要快速而简单的东西,你考虑过直接将对象序列化到磁盘上吗?


1
许多东西 Hibernate 具备,但轻量并不是其中之一。就开箱即用的持久化而言,在开始之前您需要创建数据库架构。 - Allain Lalonde
除了 Hibernate 会为您执行此操作,因此您甚至不需要考虑它。如果您希望它是轻量级的,则Hibernate可以实现。 - tddmonkey
对于应用程序速度来说,最糟糕的事情就是不考虑Hibernate的作用... - mibutec
我没有看到任何人提出不同的建议。 - tddmonkey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接