恢复继承类型之间的通用变量



我有两个类:GameObjectSampleObject : 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为空(这是正确的(。我想(用一些简写(恢复gtempObject之间的公共(共享(变量。例如:

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; }
}

最新更新