2009-01-16 55 views
15

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

我正在寻找最简单的可能解决方案。我不想要任何花哨的功能,只是简单的与简单的对象(一些集合,关系和简单的继承)一起工作,并没有给现有的代码库带来太多明显的复杂性(如果有的话)。

我知道的选项包括Hibernate和EMF等框架,但它们听起来(并且经历过)太复杂和耗时。我希望开箱即用,最好是面向文件的,而不是面向dababase的,我可以放在我的普通的旧Java对象的顶部。

这是一个新手问题,预先感谢任何类似教程的上下文澄清指导。

回答

5

ObjectOutputStream和ObjectInputStream可以做到这一点。它内置于Java中,可让您轻松地序列化/反序列化对象。

这些坏事是,如果你改变你的对象,你不能导入现有的旧对象。您必须考虑一种方法来保持与已存在用户计算机上的现有对象的兼容性,例如向类中添加版本号并创建将旧对象转换为新对象的功能。

此处了解详情:

编辑: 您也可以考虑加入以下属性所有的类了蝙蝠的权利。这可能允许您将属性添加到类中,并且仍然可以加载旧的Object文件。在RMI-land中可行,但我不确定文件。不要永远删除属性。

static final long serialVersionUID = 1L; 
9

db4o是一个对象数据库,所以没有架构设置,并很好地适应一段时间内的对象结构的变化。

+1

我真的很喜欢db4o,所以很好,很简单。 – 2009-01-16 16:03:16

+0

不幸的是'db4o已经死了http://supportservices.actian.com/versant/default.html – FoxyBOA 2015-07-19 07:01:12

2

一个简单的方法是序列化(如在Serializable中)你的对象到磁盘。

http://www.devx.com/Java/Article/9931/1954

+0

序列化唯一的问题是,如果你完全改变你的objcet,它就会掉在脸上。 – Milhous 2009-01-16 20:13:47

+0

如果您将serialVersionUID添加到您的类中,您至少可以添加属性。您仍然无法删除属性。使用java附带的serialver工具来找出你的类当前有哪些serialVersionUID。 – 2011-05-12 11:57:04

0

我不得不说对Hibernate最初的学习曲线相对较浅。您应该能够在不到一天的时间内启动并运行测试系统。只有当你想要更先进的功能时,它才开始变得更陡峭。我会建议你一定要看看,如果你最终没有选择它,我的意思是什么?

话虽如此,你有没有考虑过直接序列化你的对象到磁盘,如果你只是想快速ñ脏?

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)相比,它们依赖于其他项目的整个主机。简单XML非常轻便且具有内存高效性。

6

如果你正在寻找一些简单的东西,你可能也希望数据采用你可以读取的格式(而不是二进制文件或数据库)。如果是这样,您应该看看Java 6及更高版本中的JAXB(Java的XML绑定)。还有其他的技术可以做得更好,比如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如何查看和建模更复杂的对象。

1

我知道的最简单的选择是使用Xstream来创建一个xml文件出任何java的obect。

3

您可以试试XStream这是一个开源库。它所做的只是将POJO转换为XML,然后将其保存到磁盘中。它非常易于使用,只需要几行代码即可使用。