Сериализация Джексона должна игнорировать уже включенные объекты - PullRequest
1 голос
/ 02 декабря 2011

Так что это кажется довольно простым ответом на распространенную проблему: в Jackosn обнаружен бесконечный цикл. Если при сериализации дерева объектов Джексон наталкивается на объект, который уже сериализован, почему он просто не игнорирует его? Есть ли способ сделать это в Джексоне, или кто-то создал нечто подобное?

Зачем все это обыгрывать с помощью JsonManagedReference / JsonBackReference, что совершенно недостаточно, если вы начинаете сериализовывать дочерние объекты (для которых требуется ссылка на родительский объект) некоторое время, а иногда сериализуете родительские объекты (что, очевидно, не не хотите, чтобы ребенок возвращался к себе)?

Похоже, теперь мне нужно создать собственные представления, которые учитывают каждый тип циклической ссылки и возможный вариант использования, что в любом нетривиальном ORM является огромной задачей.

1 Ответ

0 голосов
/ 02 декабря 2011

РЕДАКТИРОВАТЬ (октябрь 2012)

Актуальный Jackson 2.x теперь поддерживает обработку идентификационной информации с аннотацией @JsonIdentityInfo!Исходный ответ немного устарел ...


OBSOLETE

Джексон не поддерживает обработку идентификаторов объектов: это нетривиальная задачане так из-за идентификации общих объектов, что может быть сделано путем обхода графа объектов (влечет за собой некоторые накладные расходы), а скорее в том, чтобы выяснить, как включить идентификационную информацию;какие идентификаторы использовать и как.Это, в свою очередь, несколько похоже на включение информации о типе, но теперь добавляет второе измерение дополнительной обертки для обработки.Об этом раньше уже просили, и некоторые думали, как это сделать, но соотношение усилий к выгоде (то есть количество запросов, насколько это необходимо) было выше, чем добавление других функций.

Таким образом, лучше всего использовать объекты-оболочки и реализовать это вручную или взглянуть на XStream, который может решить эту проблему (когда он включен; он добавляет значительные накладные расходы во времени), а также имеет режим вывода JSON с использованием Jettison.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...