В настоящее время я использую XmlSerializer
, что на удивление :) обрабатывает де-сериализацию моих структур данных - я нахожу это удивительно простым в использовании, но ценой гибкости. На данный момент я использую его для древовидной структуры; поскольку XmlSerializer
не обрабатывает циклические структуры, я добавил [XmlIgnore]
в свое свойство Parent
и выполняю итерацию после десериализации по дереву, чтобы исправить родительские узлы.
Есть ли лучший способ справиться с этим, используя XmlSerializer
, или было бы лучше переписать код, используя XmlReader/XmlWriter
? Я полагаю, что реализация IXmlSerializable
будет работать, но, похоже, изрядное количество работы при сохранении минусов XmlSerializer
.
Текущий шаг после десериализации в порядке, но я добавляю структуру данных, которая должна быть сериализована, в отдельный файл XML: в основном плоский список элементов, которым требуется свойство Parent, ссылающееся на узел из предыдущей древовидной структуры. , Это потребует еще шага после десериализации, а также сохранения атрибута Parent и ParentId (или некоторой хитрости) в новой структуре данных.
Итак, какие-нибудь умные (и не хрупкие) идеи? Или XmlReader/XmlWriter
это так?
Решение
DataContractSerializer
оказалось довольно приличным решением, с той же простотой, что и XmlSerializer. Я решил не использовать автоматическую обработку циклов, а вместо этого определить и OnDeserialized оформленный метод для обработки установки родительского узла; Таким образом, сгенерированный XML соответствует стандарту.
Одна вещь, которая меня некоторое время смущала, заключалась в том, что после десериализации у меня возникали сбои в некоторых свойствах с заданными нулевыми элементами поддержки - не мог понять, как это было возможно, поскольку вспомогательные элементы были определенно инициализированы во всех возможных конструкторах , Отладка показала, что конструкторы никогда не вызывались, и после некоторого поиска в Google я нашел этот пост SO с объяснением.