java hibernate serialization collections

java - ¿Cómo serializar las colecciones de Hibernate correctamente?



hibernate collections mapping (3)

Estoy intentando serializar objetos de una base de datos que se han recuperado con Hibernate, y solo me interesan los datos reales de los objetos en su totalidad (ciclos incluidos).

Ahora he estado trabajando con XStream , que parece poderoso. El problema con XStream es que se ve demasiado ciegamente en la información. Reconoce las PersistentCollections de Hibernate tal como son, con todos los metadatos de Hibernate incluidos. No quiero serializar esos.

Entonces, ¿hay una forma razonable de extraer la Colección original desde dentro de una Colección Persistente, y también inicializar todos los datos de referencia a los que los objetos podrían estar apuntando? ¿O puede recomendarme un mejor enfoque?

(Los resultados de Simple parecen perfectos, pero no puede hacer frente a clases de utilidad básicas como Calendar. También acepta solo un objeto anotado a la vez)


Recomiendo un enfoque más simple: usuario dozer: http://dozer.sf.net . Dozer es un mapeador de frijoles, puede usarlo para convertir, por ejemplo, un PersonEJB en un objeto de la misma clase. Dozer desencadenará de forma recursiva todas las fecthes proxy a través de llamadas getter (), y también convertirá tipos src a tipos de destino (digamos java.sql.date a java.utilDate).

Aquí hay un fragmento:

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

Tenga en cuenta que cuando el bulldozer camine por su árbol de objetos activará la carga del proxy uno por uno, de modo que si su gráfico de objetos tiene muchos proxies, verá muchas consultas, que pueden ser costosas.


Lo que generalmente parece ser la mejor manera de hacerlo, y la forma en que lo estoy haciendo actualmente es tener otra capa de objetos DTO. De esta manera, puede excluir los datos que no desea que pasen por el canal, así como también limitar la profundidad a la que se serializa el gráfico. Utilizo Dozer para mi DTO actual (objeto de transferencia de datos) de objetos Hibernate para el cliente Flex.

Funciona de maravilla, con algunas advertencias:

  • No es rápido, de hecho es francamente lento. Si envía una gran cantidad de datos, Dozer no funcionará muy bien. Esto se debe principalmente a la Reflexión involucrada en realizar su magia.
  • En algunos casos, tendrá que escribir convertidores personalizados para un comportamiento especial. Estos funcionan muy bien, pero son bidireccionales. Personalmente tuve que hackear la fuente Dozer para permitir convertidores personalizados unidireccionales.

La solución descrita aquí funcionó bien para mí: http://jira.codehaus.org/browse/XSTR-226

la idea es tener convertidor / mapeador XStream personalizado para las colecciones de hibernación, que extraerá la recopilación real de la de hibernación y llamará al convertidor estándar correspondiente (para ArrayList, HashMap, etc.)