15

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

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

我知道的选项包括 Hibernate 和 EMF 等框架,但它们听起来(并且已经经历过)过于复杂和耗时。我想要一些开箱即用的东西,最好是面向文件而不是面向 dababase,我可以把它放在我普通的旧 java 对象之上。

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

4

10 回答 10

9

db4o是一个对象数据库,因此没有模式设置,它可以很好地适应对象结构随时间的变化。

于 2009-01-16T16:00:04.650 回答
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 的外观并为更复杂的对象建模。

于 2009-01-16T16:07:24.760 回答
5

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

这些的坏处是,如果您更改对象,则无法导入现有的旧对象。您必须想办法与可能已经保存在用户计算机上的现有对象保持兼容,例如向您的类添加版本号并创建将旧对象转换为新对象的能力。

更多信息在这里:

编辑:您也可以考虑立即将以下属性添加到您的所有课程中。这可能允许您向类添加属性并且仍然能够加载旧的对象文件。在 RMI-land 这工作,但我不确定文件。永远不要删除属性。

static final long serialVersionUID = 1L;
于 2009-01-16T15:59:38.490 回答
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 非常轻量级且内存高效。

于 2009-01-16T16:04:07.433 回答
3

请参阅此类似问题Light-weight Alternative to hibernate。我所知道的最轻量级的框架是iBatis

于 2009-01-16T16:01:44.723 回答
3

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

于 2009-01-16T22:33:43.887 回答
2

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

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

于 2009-01-16T16:00:47.097 回答
1

我知道的最简单的选择是使用Xstream从任何 java obect 中制作一个 xml 文件。

于 2009-01-16T20:12:28.930 回答
0

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

话虽如此,您是否考虑过将对象直接序列化到磁盘,如果您只是想要一些快速和肮脏的东西?

于 2009-01-16T16:01:27.300 回答
0

我在生产代码中广泛使用了PersistentObject,它很好地满足了我的需求。

于 2013-05-02T17:37:36.910 回答