XmlSerializer如何Serializer子类对象属性

在需要Serializer的对象的属性中,可能有的属性的类型是基类类型的,而在实例中,该属性指向的对象可能是其子类对象,这时在Serializer或者是Deserialize时就需要考虑这种情况。
在System.Xml.Serialization namspace下,有很多attribute可以用来定制XmlSerializer的一些行为,其中很重要的一个就是XmlElementAttribute,它可以用来把xml中的tag和.net中的type对应起来,所以用XmlElementAttribute就能解决该问题:既在对象的属性上加上多个XmlElementAttribute,把该属性所以可能的对象类型和xml中的tag一一对应起来就可以。

说得可能比较抽象,具体见下面代码的第5到8行:

  1.     public class Class1
  2.     {
  3.         private BaseClass myObject;
  4.        
  5.         [XmlElement("BaseClass",typeof(BaseClass))]
  6.         [XmlElement("MyClass1",typeof(MyClass1))]
  7.         [XmlElement("MyClass2"typeof(MyClass2))]
  8.         public BaseClass Property
  9.         {
  10.             get
  11.             {
  12.                 return this.myObject;
  13.             }
  14.             set
  15.             {
  16.                 this.myObject = value;
  17.             }
  18.         }
  19.     }
下面是类型定义:
  1.     public class BaseClass
  2.     {
  3.         private string baseName;
  4.         public string BaseName
  5.         {
  6.             get
  7.             {
  8.                 return this.baseName;
  9.             }
  10.             set
  11.             {
  12.                 this.baseName = value;
  13.             }
  14.         }
  15.     }
  16.     public class MyClass1 : BaseClass
  17.     {
  18.         private string property1;
  19.         public string Property1
  20.         {
  21.             get
  22.             {
  23.                 return this.property1;
  24.             }
  25.             set
  26.             {
  27.                 this.property1 = value;
  28.             }
  29.         }
  30.     }
  31.     public class MyClass2 : BaseClass
  32.     {
  33.         private string property2;
  34.         public string Property2
  35.         {
  36.             get
  37.             {
  38.                 return this.property2;
  39.             }
  40.             set
  41.             {
  42.                 this.property2 = value;
  43.             }
  44.         }
  45.     }
最后是测试代码:
  1.            XmlSerializer xmlSerializer = new XmlSerializer(typeof(Class1));
  2.             Class1 class1 = new Class1();
  3.             MyClass2 myClass2 = new MyClass2();
  4.             myClass2.BaseName = "base name";
  5.             myClass2.Property2 = "property 2";
  6.             class1.Property = myClass2;
  7.             StringBuilder stringBuilder = new StringBuilder();           
  8.             
  9.             using (XmlWriter xmlWriter = XmlWriter.Create(stringBuilder))
  10.             {                
  11.                 xmlSerializer.Serialize(xmlWriter, class1);
  12.                 System.Diagnostics.Debug.WriteLine(stringBuilder.ToString());
  13.             }
输出为:
<?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>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值