Концептуальный вопрос о сериализации данных с циклическими ссылками - PullRequest
1 голос
/ 24 марта 2011

Я пытаюсь реализовать сериализатор в Python, который пытается сделать что-то вроде этого.

Если есть объект Foo, имеющий прямую ссылку на Bar, сериализатор будет сбрасывать все данные в Foo,и ссылка будет преобразована в дамп данных Bar.Вещи были бы сделаны рекурсивно, как это для любой произвольной глубины.

Но есть проблема, с которой я сталкиваюсь с этим подходом, с циклическими ссылками, что если Foo ссылается на Bar и Bar ссылается на Foo?Тогда будет создана бесконечная рекурсия.

Каковы подходы к решению этой проблемы.

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

Ответы [ 3 ]

2 голосов
/ 24 марта 2011

Заранее выровняйте структуру с помощью поиска в глубину, который записывает, какие элементы она видела.Присвойте каждому объекту идентификатор и замените ссылки на объекты ссылками на идентификаторы.

(по сути, превратите его в график.)

1 голос
/ 25 марта 2011

Храните список объектов, которые вы уже сериализовали.Каждый объект, который вы пытаетесь сериализовать, должен быть проверен по этому списку.Аналогичный подход заключается в переключении логического значения в каждом объекте на предмет того, был ли он уже сериализован, и, следовательно, для продолжения этого объекта.

1 голос
/ 25 марта 2011

Изучите модуль Python pickle , который автоматически сериализует циклические ссылки .Он использует идентификаторы объектов для хранения ссылок. Исходный код для Python 2.6.6 находится здесь .

...