现在我有java程序,其类目前是POJO并存储在易失性存储器中。这些都需要坚持下去。据我所知,两个流行的选择是JDO和Java Persistence API。对于那些对SQL,Torque等知之甚少的人来说,这是为程序数据添加持久性的最简单方法吗?
答案 0 :(得分:7)
序列化到文件系统的传统方法是使用Java Serialisation。但是,您需要在任何地方实施Serializable。
更简单的解决方案是使用XStream序列化为XML(然后转储到文件系统)。您不需要实现任何接口,并且大多数所有内容都会串行化和反序列化而无需进一步干预。如果需要,您可以进一步自定义序列化。我遇到的唯一问题是序列化内部类而不是故意序列化包含外部类(这是由于隐式this
引用)
答案 1 :(得分:6)
如果您不了解SQL或关系数据库,请将对象序列化到文件系统。
您必须学习JDBC以使用JDO,JPA,Hibernate或其他任何东西。除非你的POJO非常复杂,否则我建议你从那里起步并继续努力。
确保您了解索引的规范化和正确设计。
答案 2 :(得分:5)
我遇到的最简单方法是db4o:
ObjectContainer db = Db4o.openFile(location);
db.store(myObject);
List<MyObject> myObjects = db.query(MyObject.class);
另外,还有很好的方法可以用其他方式进行查询。
答案 3 :(得分:5)
如果选择序列化,请考虑使用流行度API,例如prevalayer或Space4J(更近期)。关于对象患病率:
普遍性是Klaus Wuestefeld开始的一个概念,关于如何以真实的面向对象的方式存储数据,仅使用内存快照,事务日志和序列化。
检查this article以了解有关此主题的更多信息(有关Google的更多信息)。
答案 4 :(得分:2)
听起来你可能想要坚持到数据库。但是,为了避免DB的复杂性,将POJO持久化到文件系统的一个简单解决方案是将它们序列化为XML文档。 Java 1.6 API包含javax.xml.bind包中的JAXB框架。要使用JAXB,你基本上注释你的POJO并创建marshal和unmarshal方法,如下所示:
@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();
}
}
}
让我们假设您持有一个Foo实例,其中mBar为42,那么这个解决方案会生成一个XML文件,如下所示:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Foo>
<Bar>42</Bar>
</Foo>
答案 5 :(得分:2)
DataNucleus是最简单的方法,因为它提供了JDO和JPA API,可以持久化到您想要的几乎任何类型的数据存储。为什么在DataNucleus为您完成时,为什么要在其他一个回复中写下所有JAXB代码?全部由Java标准支持