持久化java对象的最简单方法是啥?

Posted

技术标签:

【中文标题】持久化java对象的最简单方法是啥?【英文标题】:What's the easiest way to persist java objects?持久化java对象的最简单方法是什么? 【发布时间】:2010-12-29 15:35:27 【问题描述】:

现在我有 java 程序,其类当前是 POJO 并存储在易失性内存中。这些都需要坚持。据我了解,两个流行的选择是 JDO 和 Java Persistence API。对于对 SQL、Torque 等知之甚少的人,哪一种是为我的程序数据添加持久性的最简单方法?

【问题讨论】:

对于所有(不)神圣的事物,尽可能远离 Torque。 【参考方案1】:

序列化到文件系统的传统方法是使用Java Serialisation。但是你需要在任何地方实现Serializable。

更简单的解决方案是使用XStream 序列化为 XML(然后转储到文件系统)。您不需要实现任何接口,并且大多数内容都可以在没有进一步干预的情况下进行序列化和反序列化。如果需要,您可以进一步自定义序列化。我曾经遇到的唯一问题是序列化内部类而不故意序列化包含的外部类(这是由于隐含的this 引用)

【讨论】:

【参考方案2】:

如果您不了解 SQL 或关系数据库,请将对象序列化到文件系统。

您必须学习 JDBC 才能使用 JDO、JPA、Hibernate 或其他任何东西。除非您的 POJO 非常复杂,否则我建议您从那里开始并逐步提高。

确保您了解索引的规范化和正确设计。

【讨论】:

要使用 JDO、JPA 或 Hibernate,您显然不需要了解 JDBC,因为这就是这些 API 的重点。他们在持久化到 RDBMS 时使用 JDBC,因此对您隐藏了复杂性 我不同意 - 在不了解 JDBC 的情况下使用它们是不可取的。复杂性是隐藏的,但它是一个有漏洞的抽象。 不是 JDO 的抽象抽象,尽管 JPA 和 Hibernate 确实与 JDBC 紧密相关。取决于提问者决定使用哪个 API 我不太了解 JDO,无法评估它的抽象紧密性,但我不建议任何人在不了解关系数据库的情况下对它们进行持久化。【参考方案3】:

目前我遇到的最简单的方法是db4o:

ObjectContainer db = Db4o.openFile(location);
db.store(myObject);
List<MyObject> myObjects = db.query(MyObject.class);

此外,还有其他非常好的查询方式。

【讨论】:

遗憾的是:2014 年 10 月,Actian 拒绝继续为新客户积极寻求和推广商业 db4o 产品。 supportservices.actian.com/versant/default.html【参考方案4】:

如果可以选择序列化,请考虑使用流行 API,例如 prevalayer 或 Space4J(更新)。关于对象流行度:

流行度是由 Klaus Wuestefeld 提出的一个概念,关于如何以真正的面向对象的方式存储数据,仅使用内存快照、事务日志和序列化。

查看this article 了解有关此主题的更多信息(有关 Google 的更多信息)。

【讨论】:

Space4j 还提供透明的集群和索引。 链接似乎已失效 - Space4J.org 现在有所不同【参考方案5】:

听起来您可能想要持久化到数据库。但是,为了避免 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 注释添加到他们想要持久的类中。更少的代码。少处理【参考方案6】:

DataNucleus 是最简单的方法,因为它提供了 JDO 和 JPA API 来持久存储您想要的几乎任何类型的数据存储。当 DataNucleus 为您完成时,为什么要在其他回复之一中编写所有 JAXB 代码?全部由 Java 标准支持,并且是开源的。

披露:此答案的作者与 DataNucleus 项目有关。

【讨论】:

以上是关于持久化java对象的最简单方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

在 .NET 中序列化复杂对象层以进行缓存的最简单方法是啥?

在文件中存储对象/充满对象的地图的最简单方法是啥?

连接到 .NET 远程服务器对象的最简单方法是啥

在颤振飞镖中合并2个对象列表的最简单方法是啥?

从 C++ 调用 Java 方法的最简单方法是啥?

将 freemarker 对象呈现为 JSON 的最简单方法是啥?