[英]How to Serialize Hibernate Collections Properly?
我正在尝试从已使用 Hibernate 检索到的数据库中序列化对象,并且我只对整个对象的实际数据(包括周期)感兴趣。
现在我一直在使用XStream ,它看起来很强大。 XStream 的问题在于它对信息过于盲目。 它按原样识别 Hibernate 的 PersistentCollections,包括所有 Hibernate 元数据。 我不想序列化那些。
那么,是否有一种合理的方法可以从 PersistentCollection 中提取原始集合,并初始化对象可能指向的所有引用数据。 或者你能推荐我更好的方法吗?
( Simple的结果看起来很完美,但它无法应付 Calendar 这样的基本 util 类。它一次也只接受一个带注释的对象)
这里描述的解决方案对我很有效: http : //jira.codehaus.org/browse/XSTR-226
这个想法是为休眠集合使用自定义 XStream 转换器/映射器,它将从休眠集合中提取实际集合并调用相应的标准转换器(用于 ArrayList、HashMap 等)
我推荐一个更简单的方法:用户推土机: http : //dozer.sf.net 。 Dozer 是一个 bean 映射器,您可以使用它来将 PersonEJB 转换为同一类的对象。 Dozer 将通过 getter() 调用递归地触发所有代理,并且还将 src 类型转换为 dest 类型(假设 java.sql.date 到 java.utilDate)。
这是一个片段:
MapperIF mapper = DozerBeanMapperSingletonWrapper.getInstance();
PersonEJB serializablePerson = mapper.map(myPersonInstance, PersonEJB.class);
请记住,当推土机遍历您的对象树时,它会触发代理加载一个一个,所以如果您的对象图有许多代理,您将看到许多查询,这可能很昂贵。
通常似乎是最好的方法,而我目前正在做的方法是拥有另一层 DTO 对象。 通过这种方式,您可以排除不想通过通道的数据,并限制图形序列化的深度。 我将 Dozer 用于从 Hibernate 对象到 Flex 客户端的当前 DTO(数据传输对象)。
它工作得很好,但有一些警告:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.