Я пытаюсь сериализовать объекты из базы данных, которые были получены с помощью Hibernate, и меня интересуют только фактические данные объектов во всей их полноте (включая циклы).
Теперь я работаю с XStream, который кажется мощным. Проблема с XStream в том, что он слишком слепо смотрит на информацию. Он распознает PersistentCollections Hibernate такими, какие они есть, со всеми включенными метаданными Hibernate. Я не хочу их сериализовать.
Итак, есть ли разумный способ извлечь исходную коллекцию из PersistentCollection, а также инициализировать все данные, на которые могут указывать объекты. Или вы можете порекомендовать мне лучший подход?
(Результаты Простой кажутся идеальными, но он не может справиться с такими базовыми служебными классами, как Calendar. Он также принимает только один аннотированный объект за раз)
Я рекомендую более простой подход: пользовательский дозатор: 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 проходит через ваше дерево объектов, он запускает загрузку прокси-сервера один за другим, поэтому, если в вашем графе объектов много прокси, вы увидите много запросов, что может быть дорогостоящим.
Что обычно кажется лучшим способом сделать это, и то, как я сейчас это делаю, - это создать еще один уровень объектов DTO. Таким образом вы можете исключить данные, которые вы не хотите передавать по каналу, а также ограничить глубину сериализации графика. Я использую Dozer для моего текущего DTO (объекта передачи данных) от объектов Hibernate к клиенту Flex.
Он отлично работает, но с некоторыми оговорками:
решение, описанное здесь, сработало для меня: http://jira.codehaus.org/browse/XSTR-226
идея состоит в том, чтобы иметь собственный преобразователь / преобразователь XStream для коллекций спящего режима, который будет извлекать фактическую коллекцию из спящего режима и вызывать соответствующий стандартный конвертер (для ArrayList, HashMap и т. д.)
Требуется ли для этого файл конфигурации XML?