Как выделить неуниверсальный IList с объектами с помощью XMLSerializer

Я пытаюсь сериализовать некоторый объект, который содержит IList с элементами детей. IListне является универсальным, и я не могу просто сделать это в общем. Я получаю исключение типа "Тип MyObjectChild не ожидался...", и оно что-то говорит о XMLInclude, но я не думаю, что это то, что я ищу. Кто-нибудь есть идеи, как принести XMLSerialzer также сериализовать дочерние элементы? Оба элемента [Serializable]

XmlSerializer xmlSerializer = new XmlSerializer(typeof ObservableCollection<MyEntryViewItem>));
FileStream fileStream = new FileStream(exportPath, FileMode.Create);

xmlSerializer.Serialize(fileStream, _listEntries);

public IList ElementChildren { get { return _item.Children; } set { _item.Children = value; RaisePropertyChanged(() => ElementChildren); } }

[Serializable]
public sealed class ElementChild
{
    private int _id;
    private string _text;
    private string _path;
    ...
}

2 ответа

Решение

По словам Саймона Хьюитта, вы можете просто использовать XmlInclude указать тип вашего списка. Альтернативу можно найти на roboxman.wordpress.com

XmlSerializer обрабатывает IList особым образом (на самом деле ICollection и IEnumerable, но IList - оба). На странице XmlSerializer MSDN есть примечание:

XmlSerializer предоставляет особый режим для классов, которые реализуют IEnumerable или ICollection. Класс, который реализует IEnumerable, должен реализовывать открытый метод Add, который принимает один параметр. Параметр метода Add должен иметь тот же тип, который возвращается из свойства Current для значения, возвращаемого из GetEnumerator или одной из основ этого типа. Класс, который реализует ICollection (например, CollectionBase) в дополнение к IEnumerable, должен иметь открытое индексированное свойство Item (indexer в C#), которое принимает целое число, и у него должно быть открытое свойство Count типа integer. Параметр метода Add должен быть того же типа, который возвращается из свойства Item или одной из основ этого типа. Для классов, реализующих ICollection, значения для сериализации будут извлечены из индексированного свойства Item, а не путем вызова GetEnumerator.

Другие вопросы по тегам