【问题标题】:Java, what is a straightforward, simple method for persisting an object? Do all methods require serialization?Java,持久化对象的简单明了的方法是什么?所有方法都需要序列化吗?
【发布时间】:2011-03-21 09:17:12
【问题描述】:

我是做这种事情的新手,但我想找到一个简单的方法来持久化一个包含 sashMap 和列表的 Java 对象。我一直在研究这个并相信我可以序列化它并保存到常规数据库中,例如通过休眠,但我不太清楚这一点,即使在阅读了大量教程之后,因为我不确定常规列表是否可序列化。我不期望关于如何做到这一点的完整答案,而是我想知道通常认为什么是最好的方法,以最少的不必要的复杂性来做到这一点,因为我愿意使用与我目前使用的不同的数据库设置(休眠与 MySQL)

我看过像 Mongo DB 这样的选项,但我也有点困惑,我是否需要在保存到 Mongo db 之前序列化对象。我一直在阅读很多文档,但想确保我选择最简单的方法来做到这一点,而且仍然可靠,并且愿意接受任何建议,任何建议都将不胜感激。我将坚持的对象将如下所示(虽然更复杂/嵌套)

public class TestClass {

    public Map <Integer, Map> primaryHolder = new HashMap <Integer, Map>;

    public addRecord (Integer key, Map inputMap<Integer, List>) {
        primaryHolder.add(key, inputMap);
    }

}

感谢您的建议

【问题讨论】:

  • 序列化和持久化是两个完全不同的概念。序列化是关于将对象与串行字节流转换。而持久性是以持久的方式存储对象,例如通过 Hibernate 在数据库中。你对什么感兴趣?
  • @jmg:嗯,它们是相关的主题。随着序列化工作,您有一个简单的持久性方法。两者都处理将内存中的“活”对象图转换为“冻结”表示。
  • @jmg 我的目标只是对象的持久性,这是我困惑的一部分,因为据我了解,我需要序列化一个对象才能将其存储在常规数据库中,例如通过 Hibernate 到 MySQL 后端。实际上,我可能会对一种完全避免序列化的方法感兴趣,只要我能以可靠的方式将其持久化,然后稍后将其作为原始类型的 Java 对象取出
  • 这个关于hibernate的话题可能对你有帮助forum.hibernate.org/viewtopic.php?p=2403603

标签: java serialization object persistence hashmap


【解决方案1】:

不幸的是,“简单”和“直截了当”通常不能与“SQL”或“数据库”很好地混合。 Java 集合类型只是不容易映射到集合或文档。

“正确”的解决方案(就 SQL 而言)是为列表元素创建一个表,然后为内部映射创建一个表(Integer -> List)和一个用于外部映射的表。

如果您的结构包含多个元素,您将不会喜欢它的性能。

所以另一个解决方案是BLOB 列和Serializable 接口。这还有其他问题,例如:

  • 您总是需要加载整个结构
  • 结构中的所有元素都必须是可序列化的
  • 如果你不能加载一件,你就不能加载任何东西,等等)。
  • 如果您想将对象添加到通过 Hibernate 映射到表的结构中,您需要一些技巧来将实例转换为其主键并在保存和加载期间返回。

您应该考虑像 db4o 这样的 OO 数据库,它可以保存任何 Java 对象,但您在编写代码时需要不同的思维方式:突然之间,您需要考虑诸如在 Java 集合上运行 db4o 查询之类的事情。

【讨论】:

  • 感谢您的信息,基本上是速度问题,因为我使用的是具有大量内存 (+30gb) 的服务器,并且希望将我需要搜索的所有数据保留在内存中,因此它在 mysql 中作为常规表只是让我不得不将它从对象格式来回转换为 SQL。无论如何,db4o 听起来很有趣,我一定会去看看。谢谢
  • 如果您有足够的 RAM 将整个 DB 始终保存在 RAM 中,请考虑使用内存数据库 (en.wikipedia.org/wiki/In-memory_database)
【解决方案2】:

每当您将对象持久化到数据库中时,您都需要序列化该对象。

【讨论】:

    【解决方案3】:

    查看对象数据库,例如 NeoDatisdb4o。它们提供了非常简单的方法来持久化对象。

    我个人使用过 NeoDatis,不需要实现 Serializable 接口或类似的东西。

    【讨论】:

      猜你喜欢
      • 2010-12-29
      • 2010-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-20
      • 1970-01-01
      相关资源
      最近更新 更多