C #: XML сериализация узлов с циклическими ссылками - PullRequest
6 голосов
/ 15 декабря 2010

У меня есть класс Node примерно так:

class Node {
    IEnumerable<Node> inputs;
}

Который в основном определяет простой граф. Я хочу сериализовать свой график в удобочитаемую форму, поэтому обычно я бы сказал, что xml - это то, что нужно. Но XML не был создан с учетом циклических зависимостей:)

Итак, каков наилучший способ сериализации моего графа?

Я могу придумать несколько способов:

  • ditch XML, создайте мой собственный формат.
  • использовать XML, помечать каждый узел уникальным идентификатором, хранить списки соединений отдельно от узлов и разрешать после загрузки

Но я думаю, что раньше у других людей была такая же проблема, так что, возможно, есть и лучшие варианты. Кто-нибудь знает твердый подход?

Ответы [ 2 ]

3 голосов
/ 15 декабря 2010

Для xml я бы использовал подход id (изменив модель DTO так, чтобы не циклически).

Обратите внимание, что DataContractSerializer может автоматически поддерживать циклические графы объектов, передавая true для опции preserveObjectReferences в перегруженных конструкторах; это будет не так просто, как вывод XmlSerializer, но все равно будет читабельным.

1 голос
/ 15 декабря 2010

Если вы переключитесь на WCF DataContractSerializer, вы можете сохранить ссылки на объекты (в 3.5 SP 1 и более поздних версиях)

[DataContract(IsReference=true)]

У Sowmy хорошая запись здесь

...