我有两个类:GameObject
和SampleObject : GameObject
以及一个类型为GameObject
的列表。我已经将这些类的实例序列化为一个XML文档。一旦反序列化(加载(此文档,就会出现问题。
在XML文件中,实例被序列化为:
<Root>
<GameObject>
<Type>Namespace.MyType</Type>
</GameObject>
</Root>
其中Type表示所需的类型。每个实例都在GameObject标签下序列化。
在解析该文档之后,我获得了GameObject
的列表。现在我需要恢复正确的类型:
foreach (GameObject g in myList)
{
GameObject tempObject = (GameObject)Activator.CreateInstance(Type.GetType(g.TypeString));
}
问题是tempObject
为空(这是正确的(。我想(用一些简写(恢复g
和tempObject
之间的公共(共享(变量。例如:
tempObject.Property1 = g.Property1
tempObject.Property2 = g.Property2
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; }
}