2008-10-08 36 views
2

我试图序列化已经用Hibernate检索过的数据库中的对象,而我只对整个对象的实际数据感兴趣(包含循环)。如何正确地序列化Hibernate集合?

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

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

(从Simple结果似乎完美,但它不能与这些基本的util类作为日历应付它也只接受一次一个注释对象。)

回答

1

解决方案工作很适合我:http://jira.codehaus.org/browse/XSTR-226

的想法是有定制XStream的转换器/映射器休眠集合,这将提取实际征收从冬眠之一,将调用相应的标准转换器(对于ArrayList的,HashMap等)

1

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

这里有一个片段:

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

请记住,如推土机走过你的对象树会触发代理装载一个接一个,所以如果你的对象图有很多代理你会看到许多疑问,这可能是昂贵的。

+0

这是否需要XML配置文件? – 2011-04-15 18:26:19

0

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

它的伟大工程,有几个注意事项:

  • 这还不算快,其实这是彻头彻尾的慢。如果您发送大量数据,Dozer将不会表现出色。这主要是因为反思涉及到执行它的魔法。
  • 在少数情况下,您将不得不为特殊行为编写自定义转换器。这些工作非常好,但它们是双向的。我个人不得不破解Dozer源代码以允许单向定制转换器。这里所描述