我经常发现自己需要一个快速(就代码而言)、轻量级(就运行时、依赖关系而言)的持久性解决方案,用于简单的一堆对象,主要是在应用程序重新启动之间。
通常我会求助于一些 Java 序列化 hack,但我想知道是否有更好的东西。
你用过类似的东西吗?
明确地说,在我的书中,基于 JPA 的解决方案“不是轻量级”,而基于 JDBC 的解决方案“不是很快”。 更新
:与需要配置的框架相比,我更喜欢无配置的框架。例如,Java 序列化解决方案需要一个implements Serializable
并且它可以工作。 JPA 解决方案,无论是带有注释还是带有映射文件都太重量级了。
更新2:澄清一下,我不认为序列化是一种黑客行为。它实际上是一个非常强大的机制,只是我在进行持久化时以一种黑客的方式使用它。
我更喜欢
XStream;除了已经提到的 Xstream 之外。 Jackson 工作得很好,但有一点需要注意:如果您确实有大量的多态存储,反序列化可能会变得很棘手。这就是 Xstream 效果更好的地方。 我同意Java序列化不利于持久化——它有利于传输序列化对象,但持久化具有时间维度,并且类会随着时间而变化;这就是问题开始的地方(我相信你知道这一点,但由于其他人似乎对为什么持久使用序列化不好,我想我会提到它)。 与二进制格式相比,使用文本格式(json、xml)序列化的内容也更容易查看。最后,如果您需要空间效率,压缩(如 gzip)会产生奇迹,压缩后的数据大小往往相同,与格式无关(假设信息量相同)
你应该看看 JAXB。从 JRE 6 开始,它就是 Java 的一部分。它非常易于使用,并允许您从 Java 对象模型驱动 XML 模式。最好的部分是您不需要任何额外的 jar 文件或库,因为它是 Java 的一部分。查看 javax.xml.bin 包。
JRE 中 JavaDoc 的链接: http://java.sun.com/javase/6/docs/api/javax/xml/bind/package-frame.html
DB db = new DBMaker(fileName).build();
Map<String,MyObject> map = db.createTreeMap("mapName")
map.put("obj1", myObject1);
对于配置JAXB
JAXB.marshall(myObject, new File("config.xml") ); // saved. that's it
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);