Сериализатор JMS не может обработать цикл сериализации

Прошлой ночью мое веб-приложение умерло, и пользователю был возвращен белый экран. Выяснение причины не заняло много времени: PHP не хватало памяти.

После отслеживания проблемы я пришел к выводу, что JMS Serializer не справляется с циклом сериализации.

У меня есть класс ProductGroup, который имеет количество объектов Product (список). Теперь каждый Product относится к группе, к которой он принадлежит. Итак, когда пользователь пытается сериализовать ProductGroup, он делает это, а затем переходит к сериализации каждого Product, когда он возвращается к ProductGroup (который был только что сериализован), эффективно создавая цикл сериализации.

Мне удалось это исправить, но я поместил @Exclude в свойство Product::group.

Итак, вопрос в следующем: есть ли у меня другой вариант, когда дело доходит до сериализации? Возможно ли, что JMS Serializer не способен разобраться в петле?


person Jovan Perovic    schedule 24.08.2015    source источник


Ответы (1)


Вы можете попробовать установить MaxDepth для ProductGroup->products и Product->group, чтобы убедиться, что это не зациклится. Кроме того, использование вашего подхода с различными группами сериализации для групп + продукт и продукт + группа может смягчить это и гарантировать, что вы все еще можете иметь связанную группу при извлечении одного продукта.

Что касается вашего второго вопроса, в Doctrine даже не рекомендуется иметь ссылки в обоих направлениях, поэтому JMS\Serializer выдает какое-то исключение вместо того, чтобы пытаться «исправить», это похоже на ожидаемое поведение.

person dbrumann    schedule 24.08.2015
comment
Я понимаю. Что ж, MaxDepth ближе всего к тому, что я могу от него требовать :) Спасибо! Что касается отношения, то оно действительно одинарное обратное OneToMany. Если бы у меня были две отдельные, но действительные ссылки, идущие туда и обратно, я предполагаю, что это было бы большой проблемой :) - person Jovan Perovic; 25.08.2015