Java 如何正确序列化Hibernate集合?
我试图从一个使用Hibernate检索的数据库中序列化对象,我只对对象的实际数据的整体(包括周期)感兴趣 现在我一直在和他合作,这似乎很强大。XStream的问题在于它过于盲目地关注信息。它可以识别Hibernate的PersistentCollections,包括所有Hibernate元数据。我不想序列化这些 那么,是否有一种合理的方法可以从PersistentCollection中提取原始集合,并初始化对象可能指向的所有引用数据。或者你能推荐我一个更好的方法吗Java 如何正确序列化Hibernate集合?,java,hibernate,serialization,collections,Java,Hibernate,Serialization,Collections,我试图从一个使用Hibernate检索的数据库中序列化对象,我只对对象的实际数据的整体(包括周期)感兴趣 现在我一直在和他合作,这似乎很强大。XStream的问题在于它过于盲目地关注信息。它可以识别Hibernate的PersistentCollections,包括所有Hibernate元数据。我不想序列化这些 那么,是否有一种合理的方法可以从PersistentCollection中提取原始集合,并初始化对象可能指向的所有引用数据。或者你能推荐我一个更好的方法吗 (来自的结果看起来很完美,但它
(来自的结果看起来很完美,但它无法处理诸如Calendar之类的基本util类。它一次只接受一个带注释的对象)我推荐一种更简单的方法:user dozer:。Dozer是一个bean映射器,您可以使用它将PersonEJB转换为同一类的对象。Dozer将通过getter()调用递归地触发所有代理fecthes,并将src类型转换为dest类型(比如java.sql.date转换为java.utilDate) 下面是一个片段:
MapperIF mapper = DozerBeanMapperSingletonWrapper.getInstance();
PersonEJB serializablePerson = mapper.map(myPersonInstance, PersonEJB.class);
请记住,当dozer遍历您的对象树时,它将触发代理逐个加载,因此如果您的对象图有许多代理,您将看到许多查询,这些查询可能非常昂贵。通常最好的方法是什么,而我目前的做法是使用另一层DTO对象。通过这种方式,您可以排除不希望通过通道的数据,并限制图形序列化的深度。我将Dozer用于从Hibernate对象到Flex客户端的当前DTO(数据传输对象) 它工作得很好,但有几个注意事项:
- 它不快,事实上它非常慢。如果发送大量数据,推土机将无法正常工作。这主要是因为在表演它的魔法时涉及到反射
- 在某些情况下,您必须为特殊行为编写自定义转换器。这些工作非常好,但它们是双向的。我个人不得不破解推土机的来源,以允许单向自定义转换器
我们的想法是为hibernate集合定制XStream converter/mapper,它将从hibernate one中提取实际集合,并调用相应的标准转换器(用于ArrayList、HashMap等)这是否需要XML配置文件?