Сериализация / Дериализация древовидной структуры

Я пытаюсь найти лучший способ сохранить (сериализовать), а затем открыть (десериализовать) древовидную структуру. Моя структура состоит из различных типов объектов с разными свойствами, но каждый наследует от базового абстрактного класса "Node".

Каждый узел имеет уникальный идентификатор (GUID) и имеет метод AddSuperNode (Node nd), который устанавливает родителя узла. Это, в свою очередь, вызывает другие методы, которые позволяют родительскому узлу знать, какие у него есть подузлы. Тем не менее, некоторые узлы также используютAddAuxSuperNode () метод, который добавляет вторичного родителя к узлу.

Я использовал двоичную сериализацию, но теперь я думаю, что хочу использовать что-то, где у меня есть немного больше контроля, и сериализованные данные более доступны. Я также хочу сохранить информацию о типе при десериализации и иметь возможность сериализации частных значений. ТакDataContractSerializer казалось, лучший путь.

Я не могу просто сериализовать рутУзел непосредственно из-за узлов, имеющих несколько родителей. Я не хочу создавать дубликаты объектов. Казалось бы, мне нужно деконструировать дерево в плоский список, а затем сериализовать его. Затем после сериализации этого списка восстановить дерево. Это звучит правильно?

Как я уже говорил перед каждымУзел имеет уникальный идентификатор GUID, но сейчас узлы напрямую ссылаются на своих родителей / детей и не хранят свои идентификаторы. Я мог бы обновитьAddSuperNode () а такжеAddAuxSuperNode () методы для обновления списка родительских идентификаторов для сериализации в дополнение к прямым ссылкам. Но я бы предпочел только обновлять / создавать этот список, когда объект сериализуется. Так что я думал создатьUpdateSuperNodeIDRefs () метод в узле, который будет вызван непосредственно перед сериализацией.

Вот что я планирую сделать для сериализации и десериализации этой структуры. Может кто-нибудь предложить лучший / чище / более эффективный способ сделать это?

Сериализация

1) Укажите корневой узел древовидной структуры

2) Разбить древовидную структуру на плоскуюСловарь (идентификатор Guid, Node nd) гдеЯ бы этосправ изй.

3) ПозвонитьUpdateSuperNodeIDRefs (); для каждого узла обновить идентификаторы, которые он сохранил для своих родителей.

4) СериализацияСловарь узлов сDataContractSerializer

Десериализация

1) ДесериализоватьСловарь узлов

2) пройти через каждыйУзел вСловарьвоссоединяясь каждый со своими родителями. Для любых сохраненных идентификаторов родителей найдите соответствующиеУзел(s) вСловарь с соответствующими идентификаторами вызовитеAddSuperNode () или жеAddAuxSuperNode () повторно подключить узел к его родителю (ям)

3) Из любогоУзел в словаре найти корень структуры

4) Вернуть рутУзел

Ответы на вопрос(1)

Ваш ответ на вопрос