持久化Java对象有哪些轻量级选项?
我正在寻找最简单的解决方案.我不希望任何花哨的特征只是简单的东西,与合理简单的对象(一些集合,关系和简单的继承)一起工作,并且不会给现有的代码库带来太多明显的复杂性(如果有的话).
我所知道的选项包括Hibernate和EMF这样的框架,但它们听起来(并且经验丰富)过于复杂和耗时.我喜欢开箱即用的东西,最好是文件导向而不是面向dababase,我可以把它放在我普通的旧Java对象之上.
这是一个新手问题,提前感谢任何类似教程的上下文澄清指南.
db4o是一个对象数据库,因此没有架构设置,它可以很好地适应对象结构随时间的变化.
如果您正在查看简单的内容,您可能还希望以可以读取的格式(不是二进制文件或数据库)来获取数据.如果是这种情况,您应该查看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的外观并为更复杂的对象建模.
ObjectOutputStream和ObjectInputStream可以执行此操作.它内置于Java中,允许您非常轻松地序列化/反序列化对象.
关于这些的坏处是,如果您更改对象,则无法导入现有的旧对象.您将不得不考虑一种与可能已经保存在用户计算机上的现有对象保持兼容的方法,例如向类中添加版本号并创建将旧对象转换为新对象的功能.
更多信息:
http://java.sun.com/j2se/1.4.2/docs/api/java/io/ObjectOutputStream.html
http://java.sun.com/j2se/1.4.2/docs/api/java/io/ObjectInputStream.html
编辑:您也可以考虑立即将所有类添加以下属性.这可能允许您然后向类添加属性,并仍然能够加载旧的Object文件.在RMI-land中,这可行,但我不确定文件.不要删除属性.
static final long serialVersionUID = 1L;