Как правильно сериализовать коллекции Hibernate?

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

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

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

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

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
0
8 485
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

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

Требуется ли для этого файл конфигурации XML?

Stefan Kendall 15.04.2011 22:26

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

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

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

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

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

Другие вопросы по теме