在需要Serializer的对象的属性中,可能有的属性的类型是基类类型的,而在实例中,该属性指向的对象可能是其子类对象,这时在Serializer或者是Deserialize时就需要考虑这种情况。
在System.Xml.Serialization namspace下,有很多attribute可以用来定制XmlSerializer的一些行为,其中很重要的一个就是XmlElementAttribute,它可以用来把xml中的tag和.net中的type对应起来,所以用XmlElementAttribute就能解决该问题:既在对象的属性上加上多个XmlElementAttribute,把该属性所以可能的对象类型和xml中的tag一一对应起来就可以。
说得可能比较抽象,具体见下面代码的第5到8行:
下面是类型定义:
最后是测试代码:
输出为:
<?xml version="1.0" encoding="utf-16"?><Class1 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><MyClass2><BaseName>base name</BaseName><Property2>property 2</Property2></MyClass2></Class1>
在System.Xml.Serialization namspace下,有很多attribute可以用来定制XmlSerializer的一些行为,其中很重要的一个就是XmlElementAttribute,它可以用来把xml中的tag和.net中的type对应起来,所以用XmlElementAttribute就能解决该问题:既在对象的属性上加上多个XmlElementAttribute,把该属性所以可能的对象类型和xml中的tag一一对应起来就可以。
说得可能比较抽象,具体见下面代码的第5到8行:
- public class Class1
- {
- private BaseClass myObject;
-
- [XmlElement("BaseClass",typeof(BaseClass))]
- [XmlElement("MyClass1",typeof(MyClass1))]
- [XmlElement("MyClass2", typeof(MyClass2))]
- public BaseClass Property
- {
- get
- {
- return this.myObject;
- }
- set
- {
- this.myObject = value;
- }
- }
- }
- public class BaseClass
- {
- private string baseName;
- public string BaseName
- {
- get
- {
- return this.baseName;
- }
- set
- {
- this.baseName = value;
- }
- }
- }
- public class MyClass1 : BaseClass
- {
- private string property1;
- public string Property1
- {
- get
- {
- return this.property1;
- }
- set
- {
- this.property1 = value;
- }
- }
- }
- public class MyClass2 : BaseClass
- {
- private string property2;
- public string Property2
- {
- get
- {
- return this.property2;
- }
- set
- {
- this.property2 = value;
- }
- }
- }
- XmlSerializer xmlSerializer = new XmlSerializer(typeof(Class1));
- Class1 class1 = new Class1();
- MyClass2 myClass2 = new MyClass2();
- myClass2.BaseName = "base name";
- myClass2.Property2 = "property 2";
- class1.Property = myClass2;
- StringBuilder stringBuilder = new StringBuilder();
- using (XmlWriter xmlWriter = XmlWriter.Create(stringBuilder))
- {
- xmlSerializer.Serialize(xmlWriter, class1);
- System.Diagnostics.Debug.WriteLine(stringBuilder.ToString());
- }
<?xml version="1.0" encoding="utf-16"?><Class1 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><MyClass2><BaseName>base name</BaseName><Property2>property 2</Property2></MyClass2></Class1>