XmlSerializer
поддерживает полиморфизм, но вам нужно будет заранее указать, какие типы вывести. Вы можете сделать это, используя атрибут базового типа:
[XmlInclude(typeof(SampleObject))]
public class GameObject
{
}
Вы также можете передать эти типы в конструктор XmlSerializer
, например, если у вас нет класса GameObject
. Полный пример:
Root root = new Root();
root.Objects.Add(new GameObject { Property1 = 2 });
root.Objects.Add(new SampleObject { Property1 = 5, Property2 = 12 });
XmlSerializer ser = new XmlSerializer(typeof(Root), new Type[] { typeof(SampleObject) });
using (MemoryStream stream = new MemoryStream())
{
ser.Serialize(stream, root);
stream.Position = 0;
Root deserialized = (Root)ser.Deserialize(stream);
}
Выводит следующий xml:
<?xml version="1.0"?>
<Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<GameObject>
<Property1>2</Property1>
</GameObject>
<GameObject xsi:type="SampleObject">
<Property1>5</Property1>
<Property2>12</Property2>
</GameObject>
</Root>
Я использовал следующие классы для этого примера:
[XmlRoot]
public class Root
{
public Root()
{
Objects = new List<GameObject>();
}
[XmlElement("GameObject")]
public List<GameObject> Objects { get; set; }
}
public class GameObject
{
public int Property1 { get; set; }
}
public class SampleObject : GameObject
{
public int Property2 { get; set; }
}