持久化Java对象有哪些轻量级选项?
我正在寻找最简单的解决方案。我不希望任何花哨的特征只是简单的东西,与合理简单的对象(一些集合,关系和简单的继承)一起工作,并且不会给现有的代码库带来太多明显的复杂性(如果有的话)。
我所知道的选项包括Hibernate和EMF这样的框架,但它们听起来(并且经验丰富)过于复杂和耗时。我想要一些开箱即用的东西,最好是文件导向而不是面向dababase,我可以把它放在我普通的旧java对象之上。
这是一个新手问题,提前感谢任何类似教程的上下文澄清指南。
答案 0 :(得分:9)
db4o 是一个对象数据库,因此没有架构设置,它可以很好地适应对象结构随时间的变化。
答案 1 :(得分: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的外观并为更复杂的对象建模。
答案 2 :(得分:5)
ObjectOutputStream和ObjectInputStream可以执行此操作。它内置于Java中,允许您非常轻松地序列化/反序列化对象。
关于这些的坏处是,如果更改对象,则无法导入现有的旧对象。您必须考虑一种与可能已保存在用户计算机上的现有对象保持兼容的方法,例如向类中添加版本号并创建将旧对象转换为新对象的功能。
更多信息:
编辑: 您也可以考虑立即向所有类添加以下属性。这可能允许您然后向类添加属性,并仍然能够加载旧的Object文件。在RMI-land中,这可行,但我不确定文件。不要删除属性。
static final long serialVersionUID = 1L;
答案 3 :(得分: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之外没有任何依赖性。与其他对象相比,如JAXB,XStream,Castor等XML技术,它依赖于大量其他项目。简单XML非常轻量级且内存效率高。
答案 4 :(得分:3)
查看类似问题Light-weight alternative to hibernate。我所知道的最轻量级框架是iBatis
答案 5 :(得分:3)
您可以尝试XStream这是一个开源库。它所做的只是将您的POJO转换为XML,然后您可以将其保存到磁盘。它非常易于使用,只需几行代码即可使用。
答案 6 :(得分:2)
一种简单的方法是将对象序列化(如Serializable中)到磁盘。
答案 7 :(得分:1)
我所知道的最简单的选项是使用Xstream从任何java obect创建一个xml文件。
答案 8 :(得分:0)
我不得不说Hibernate的初始学习曲线相对较浅。您应该能够在不到一天的时间内启动并运行测试系统。只有当您需要更高级的功能时才开始变得更加陡峭。我建议你一定要看看,我的意思是如果你最终没有选择它会是什么日子?
话虽如此,您是否考虑过直接将对象序列化为磁盘,如果您只是想要快速肮脏的东西?
答案 9 :(得分:0)
我在生产代码中广泛使用了PersistentObject,它很好地满足了我的需求。