【问题标题】:How to Serialize Hibernate Collections Properly?如何正确序列化 Hibernate 集合?
【发布时间】:2008-10-08 11:48:47
【问题描述】:

我正在尝试从使用 Hibernate 检索到的数据库中序列化对象,我只对对象的完整实际数据感兴趣(包括周期)。

现在我一直在使用XStream,这似乎很强大。 XStream 的问题在于它在信息上看起来过于盲目。它可以识别 Hibernate 的 PersistentCollections,包括所有的 Hibernate 元数据。我不想序列化那些。

那么,有没有一种合理的方法可以从 PersistentCollection 中提取原始集合,并初始化对象可能指向的所有引用数据。或者你能推荐我一个更好的方法吗?

Simple 的结果看起来很完美,但它无法处理像 Calendar 这样的基本 util 类。它一次也只接受一个带注释的对象)

【问题讨论】:

    标签: java hibernate serialization collections


    【解决方案1】:

    这里描述的解决方案对我很有效:http://jira.codehaus.org/browse/XSTR-226

    这个想法是为休眠集合定制 XStream 转换器/映射器,它将从休眠集合中提取实际集合并调用相应的标准转换器(用于 ArrayList、HashMap 等)

    【讨论】:

      【解决方案2】:

      我推荐一种更简单的方法:用户推土机:http://dozer.sf.net。 Dozer 是一个 bean 映射器,您可以使用它来将 PersonEJB 转换为同一类的对象。 Dozer 将通过 getter() 调用递归地触发所有代理 fecthes,并且还将 src 类型转换为 dest 类型(比如说 java.sql.date 到 java.utilDate)。

      这是一个sn-p:

      MapperIF mapper = DozerBeanMapperSingletonWrapper.getInstance();
      PersonEJB serializablePerson = mapper.map(myPersonInstance, PersonEJB.class);
      

      请记住,当推土机遍历您的对象树时,它将触发代理加载一一,因此如果您的对象图有很多代理,您会看到很多查询,这可能会很昂贵。

      【讨论】:

      • 这需要 XML 配置文件吗?
      【解决方案3】:

      通常似乎是最好的方法,而我目前正在做的方法是拥有另一层 DTO 对象。通过这种方式,您可以排除不想通过通道的数据,并限制图形序列化的深度。我将 Dozer 用于从 Hibernate 对象到 Flex 客户端的当前 DTO(数据传输对象)。

      效果很好,但有一些注意事项:

      • 它并不快,事实上它非常慢。如果您发送大量数据,Dozer 的性能将不会很好。这主要是因为反射在发挥它的魔力时所涉及的。
      • 在少数情况下,您必须为特殊行为编写自定义转换器。这些工作非常好,但它们是双向的。我个人不得不破解 Dozer 源以允许单向自定义转换器。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-07-23
        • 1970-01-01
        • 1970-01-01
        • 2012-01-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多