现在我有 java 程序,其类当前是 POJO 并存储在易失性内存中。这些都需要坚持。据我了解,两个流行的选择是 JDO 和 Java Persistence API。对于对 SQL、Torque 等知之甚少的人,哪一种是为我的程序数据添加持久性的最简单方法?
6 回答
序列化到文件系统的传统方法是使用Java 序列化。但是,您需要在任何地方实现Serializable。
一个更简单的解决方案是使用XStream序列化为 XML(然后转储到文件系统)。您不需要实现任何接口,并且大多数内容都可以在没有进一步干预的情况下进行序列化和反序列化。如果需要,您可以进一步自定义序列化。我曾经遇到的唯一问题是序列化内部类而不故意序列化包含的外部类(这是由于隐式this
引用)
如果您不了解 SQL 或关系数据库,请将对象序列化到文件系统。
您必须学习 JDBC 才能使用 JDO、JPA、Hibernate 或其他任何东西。除非您的 POJO 非常复杂,否则我建议您从那里开始并逐步提高。
确保您了解索引的规范化和正确设计。
我遇到的最简单的方法是db4o:
ObjectContainer db = Db4o.openFile(location);
db.store(myObject);
List<MyObject> myObjects = db.query(MyObject.class);
此外,还有其他非常好的查询方式。
如果可以选择序列化,请考虑使用流行 API,如prevalayer或Space4J(更新)。关于对象流行度:
Prevalence 是由 Klaus Wuestefeld 提出的一个概念,关于如何以真正的面向对象的方式存储数据,仅使用内存快照、事务日志和序列化。
查看本文以了解有关此主题的更多信息(有关 Google 的更多信息)。
听起来你可能想坚持到数据库。但是,为了避免 DB 的复杂性,将 POJO 持久化到文件系统的一种简单解决方案是将它们序列化为 XML 文档。Java 1.6 API 包括 javax.xml.bind 包中的JAXB框架。要使用 JAXB,您基本上注释您的 POJO 并创建编组和解组方法,如下所示:
@XmlRootElement(name="Foo")
public class Foo {
@XmlElement(name="Bar")
public int mBar;
public static void marshal(Foo foo, OutputStream out) IOException {
try {
JAXBContext jc = JAXBContext.newInstance(Foo.class);
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(qaConfig, out);
}
catch (JAXBException ex) {
throw new IOException(ex);
}
finally {
out.close();
}
}
public static Foo unmarshal(InputStream in) throws IOException {
try {
JAXBContext jc = JAXBContext.newInstance(Foo.class);
Unmarshaller unmarshaller = jc.createUnmarshaller();
return (Foo)unmarshaller.unmarshal(in);
}
catch (JAXBException ex) {
throw new IOException(ex);
}
finally {
in.close();
}
}
}
假设您保留了一个 mBar 为 42 的 Foo 实例,那么此解决方案将生成一个 XML 文件,如下所示:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Foo>
<Bar>42</Bar>
</Foo>
DataNucleus是最简单的方法,因为它提供了 JDO 和 JPA API 来持久存储您想要的几乎任何类型的数据存储。当 DataNucleus 为您完成时,为什么要在其他回复之一中编写所有 JAXB 代码?全部由 Java 标准支持,并且是开源的。
披露:此答案的作者与 DataNucleus 项目有关。