Использование XmlSerializer для сериализации производных classов

Я использую XMLSerializer для сериализации объекта, который содержит общий список

List Children {get;set}

Проблема в том, что каждый элемент происходит из ChildBase который на самом деле является абстрактным classом. Когда я пытаюсь десериализовать, я получаю invalidOperationException

Есть ли способ использовать XMLSerializer с производными объектами? Благодарю.

Существует три способа сделать это; либо вы можете использовать [XmlInclude] для типа, либо вы можете использовать XmlElement / XmlArrayItem для свойства. Все они показаны ниже; раскомментируйте пару, которую вы предпочитаете:

 using System; using System.Collections.Generic; using System.Xml.Serialization; public class MyWrapper { //2: [XmlElement("A", Type = typeof(ChildA))] //2: [XmlElement("B", Type = typeof(ChildB))] //3: [XmlArrayItem("A", Type = typeof(ChildA))] //3: [XmlArrayItem("B", Type = typeof(ChildB))] public List Data { get; set; } } //1: [XmlInclude(typeof(ChildA))] //1: [XmlInclude(typeof(ChildB))] public abstract class ChildClass { public string ChildProp { get; set; } } public class ChildA : ChildClass { public string AProp { get; set; } } public class ChildB : ChildClass { public string BProp { get; set; } } static class Program { static void Main() { var ser = new XmlSerializer(typeof(MyWrapper)); var obj = new MyWrapper { Data = new List { new ChildA { ChildProp = "abc", AProp = "def"}, new ChildB { ChildProp = "ghi", BProp = "jkl"}} }; ser.Serialize(Console.Out, obj); } } 

Вы можете использовать XmlIncludeAttribute для этого. Или посмотрите это сообщение по другому пути.

  • Сериализация Xml - Скрыть нулевые значения
  • Сериализация объекта в XML
  • Как сериализовать объект в XML без получения xmlns = "..."?
  • Условная сериализация XML
  • Почему свойства без сеттера не сериализованы
  • Почему моя публичная собственность не сериализована XmlSerializer?
  • Как я могу сериализовать внутренние classы с помощью XmlSerializer?
  • Сделать пользовательский class Serializable в Objective-c / iPhone?
  • FileMode.Open и FileMode.OpenOrCreate разница, когда файл существует? c # ошибка?
  • {" не ожидалось.} Deserializing Twitter XML
  • NHibernate: Как мне XmlSerialize ISet ?
  • Давайте будем гением компьютера.