Как правильно сериализовать коллекции Hibernate? - PullRequest
2 голосов
/ 08 октября 2008

Я пытаюсь сериализовать объекты из базы данных, которые были получены с помощью Hibernate, и меня интересуют только фактические данные объектов во всей их полноте (включая циклы).

Теперь я работаю с XStream , который кажется мощным. Проблема с XStream заключается в том, что он слишком слепо смотрит на информацию. Он распознает PersistentCollections Hibernate в том виде, в каком они есть, включая все метаданные Hibernate. Я не хочу сериализовать их.

Итак, есть ли разумный способ извлечь исходную коллекцию из коллекции PersistentCollection, а также инициализировать все ссылочные данные, на которые могут указывать объекты. Или вы можете порекомендовать мне лучший подход?

(Результаты из Simple кажутся идеальными, но он не может справиться с такими базовыми классами утилит, как Calendar. Он также принимает только один аннотированный объект одновременно)

Ответы [ 3 ]

1 голос
/ 23 ноября 2009

решение, описанное здесь, хорошо работает для меня: http://jira.codehaus.org/browse/XSTR-226

Идея состоит в том, чтобы иметь собственный конвертер / маппер XStream для коллекций hibernate, который будет извлекать фактическую коллекцию из коллекции hibernate и будет вызывать соответствующий стандартный конвертер (для ArrayList, HashMap и т. Д.)

1 голос
/ 08 октября 2008

Я рекомендую более простой подход: пользователь dozer: 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);

Имейте в виду, что, когда бульдозер проходит по вашему дереву объектов, он будет запускать загрузку прокси один за другим, поэтому, если ваш граф объектов имеет много прокси, вы увидите много запросов, которые могут быть дорогими.

0 голосов
/ 11 января 2009

То, что обычно кажется лучшим способом сделать это, и способ, которым я сейчас занимаюсь, это иметь еще один слой объектов DTO. Таким образом, вы можете исключить данные, которые вы не хотите передавать по каналу, а также ограничить глубину сериализации графика. Я использую Dozer для моего текущего DTO (объекта передачи данных) из объектов Hibernate в клиент Flex.

Отлично работает, с несколькими оговорками:

  • Это не быстро, на самом деле это очень медленно. Если вы отправите много данных, Dozer не будет работать очень хорошо. Это в основном из-за отражения, задействованного в выполнении его магии.
  • В некоторых случаях вам придется писать собственные конвертеры для особого поведения. Они работают очень хорошо, но они двунаправлены. Мне лично пришлось взломать исходный код Dozer, чтобы разрешить однонаправленные пользовательские преобразователи.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...