Немного нетривиальная структура данных: подходит ли мне XmlSerializer? - PullRequest
4 голосов
/ 26 августа 2010

В настоящее время я использую XmlSerializer, что на удивление :) обрабатывает де-сериализацию моих структур данных - я нахожу это удивительно простым в использовании, но ценой гибкости. На данный момент я использую его для древовидной структуры; поскольку XmlSerializer не обрабатывает циклические структуры, я добавил [XmlIgnore] в свое свойство Parent и выполняю итерацию после десериализации по дереву, чтобы исправить родительские узлы.

Есть ли лучший способ справиться с этим, используя XmlSerializer, или было бы лучше переписать код, используя XmlReader/XmlWriter? Я полагаю, что реализация IXmlSerializable будет работать, но, похоже, изрядное количество работы при сохранении минусов XmlSerializer.

Текущий шаг после десериализации в порядке, но я добавляю структуру данных, которая должна быть сериализована, в отдельный файл XML: в основном плоский список элементов, которым требуется свойство Parent, ссылающееся на узел из предыдущей древовидной структуры. , Это потребует еще шага после десериализации, а также сохранения атрибута Parent и ParentId (или некоторой хитрости) в новой структуре данных.

Итак, какие-нибудь умные (и не хрупкие) идеи? Или XmlReader/XmlWriter это так?

Решение

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

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

Ответы [ 2 ]

1 голос
/ 26 августа 2010

Используйте DataContractSerializer. Отметьте ваши классы с [DataContract(IsReference = true)].

1 голос
/ 26 августа 2010

Вы можете попробовать двоичную сериализацию (BinarySerializer или DataContractSerializer), которая, я думаю, обрабатывает циклические графы несколько лучше, за счет отсутствия удобочитаемого представления данных. В качестве альтернативы, вы можете попробовать SoapFormatter как подробно здесь .

...