快速而简单的持久化

17

我经常需要一个快速(以代码为单位)的轻量级(运行时和依赖项方面)持久化解决方案,仅用于一堆对象,主要是在应用程序重新启动之间。

通常我会采取一些Java序列化技巧,但我想知道是否有更好的方法。

你使用过类似的东西吗?


请明确,基于JPA的解决方案在我看来不是轻量级的,而基于JDBC的解决方案也不是快速的


更新: 我更喜欢无需配置的框架,而不是需要配置的框架。例如,Java序列化解决方案需要implements Serializable,并且它可以工作。使用注释或映射文件的JPA解决方案将太过笨重。

更新2: 仅仅为了说明,我不认为序列化是一个hack。它实际上是一个非常强大的机制,只是在进行持续性处理时,我会以hackish的方式使用它。


+1 对于我可能很快需要的问题 - KLE
9个回答

10
我更喜欢XStream,这是一个简单的库,用于将对象序列化为XML并进行反序列化。只需要一个Jar文件,速度快且非常易于使用。

是的。XStream非常容易使用。 - Nat
JAXB不需要单独的jar包,它已经随着JVM一起发布了。 - Andrejs

5

尝试使用 iBatis。我最近在一个项目中使用了它,该项目需要 JDBC 抽象化而不需要 ORM/spring/container 等。

易于设置,仅需几个小的 JAR 包,并且配置非常灵活。它不会像 Hibernate 等框架那样给您提供随时更改数据库的灵活性,但它相对较轻量级。


根据对问题的更新,我会建议选择XStream。 - Mike Reedell

3
也许 db4o 适合您。不要被名称所迷惑,它可以嵌入。根据其教程
Object yourObject = ...;

String fileName = ...; // where you wish to store the objects
ObjectContainer container = Db4oEmbedded.openFile(Db4oEmbedded.newConfiguration(), fileName);
try {
    container.store(yourObject);
} finally {
    container.close();
}

3
我会添加 Jackson (json)JAXB (xml);除了已经提到的 Xstream 外。Jackson 在处理单一类型时效果很好,但有一个小问题:如果您有大量多态存储,反序列化可能会变得棘手。这就是 Xstream 更好的地方。
我同意 Java 序列化不适用于持久性——它适用于传输序列化对象,但持久性具有时间维度,并且类随时间而改变;这就是问题的起源(我相信您知道这一点,但由于其他人似乎对为什么使用序列化进行持久化感到困惑,所以我想提一下)。使用文本格式(json、xml)序列化的东西更容易直观地查看,而不是二进制格式。最后,如果您需要节省空间,压缩(如 gzip)可以发挥巨大作用,压缩后的数据大小 tends to be identical,与格式无关(假设信息量相同)。

忘了提一下:在大多数情况下,Jackson 不需要任何配置。如果您想要使用注释、配置等,可以这样做;但在大多数情况下,它与 XStream 的工作方式类似,是零配置的。 - StaxMan

2
你应该看一下JAXB。它是Java自从JRE 6以来的一部分。它很容易使用,并允许您从您的Java对象模型驱动XML模式。最好的部分是,您不需要任何额外的jar文件或库,因为它是Java的一部分。请查看javax.xml.bin包。
关于JAXB项目本身的信息: https://jaxb.dev.java.net
JRE中JavaDocs的链接: http://java.sun.com/javase/6/docs/api/javax/xml/bind/package-frame.html

2
  1. 对于对象集合,请尝试使用JDBM(一个jar)。它提供了一个存储在磁盘上的映射表。

    DB db = new DBMaker(fileName).build();

    Map<String,MyObject> map = db.createTreeMap("mapName")

    map.put("obj1", myObject1);

  2. 对于配置,JAXB非常简单,没有依赖关系。以XML格式存储。

    JAXB.marshall(myObject, new File("config.xml") ); // 保存。就是这样


1

看看BeanKeeper - 这是我见过的最快、最简单、最容易的ORM/持久化。肯定比iBatis好多了。

Store myStore = new Store((DataSource) ctx.lookup("jdbc/myds"));

package com.acme.bookstore;
public class Book
{
  private String title;
  private Author author;

  ...setters, getters...
}

package com.acme.bookstore;
public class Author
{
   private String firstName;
   private String lastName;
   private Date birthDate;

   ...setters, getters...
 }

store.save(book);

1

你正在寻找

一种简单的对象持久化解决方案

那么为什么Java内置的序列化是一个hack呢?

如果你懒得自己实现,也许使用JSON进行序列化会有所帮助。


序列化不是一种黑客技术。我的处理方式才是。因此,我正在寻找其他人如何处理这种情况,并从他们的经验中汲取灵感。 - Robert Munteanu
谈到序列化时,请检查JBoss序列化,它比JDK的实现具有几个技术优势。 - Ondra Žižka

1

Prevayler 对你来说似乎是一个不错的选择。

它基于 Java 序列化,速度非常快。

更多信息请参见:

  • http://www.prevayler.org/
  • http://www.prevayler.org/wiki/

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