当前位置: 移动技术网 > IT编程>开发语言>c# > C#中将xml文件反序列化为实例时采用基类还是派生类的知识点讨论

C#中将xml文件反序列化为实例时采用基类还是派生类的知识点讨论

2020年03月09日  | 移动技术网IT编程  | 我要评论

基类:

using system;
using system.collections.generic;
using system.linq;
using system.text;

namespace deserializetest
{
 public class settingsbase
 {
 private string m_filename;

 public string filename 
 {
  get { return m_filename; }
  set { m_filename = value; }
 }
  
 }
}

派生类:

using system;
using system.collections.generic;
using system.linq;
using system.text;

namespace deserializetest
{
 public class worldwindsettings : settingsbase
 {
  public worldwindsettings()
   : base()
  {
  }


  private string m_proxyurl = "";

  public string proxyurl
  {
   get
   {
    return m_proxyurl;
   }
   set
   {
    this.m_proxyurl = value;
   }
  }
 }
}

主函数调用测试代码为:

using system;
using system.collections.generic;
using system.linq;
using system.text;

using system.io;
using system.xml.serialization;

namespace deserializetest
{
 class program
 {
  static void main(string[] args)
  {
   //测试1:测试将xml文件反序列化为基类实例。测试通过。只要xml文件的根节点的名字与被反序列化的类的名字一致即可
   string filenamebase = @"d:\myproject\deserializetest\deserializetest\bin\debug\gobalconfig\settingsbase.xml";
   settingsbase settingsbase;
   xmlserializer serbase = new xmlserializer(typeof(settingsbase));
   using (textreader trbase = new streamreader(filenamebase))
   {
    settingsbase = (settingsbase)serbase.deserialize(trbase);
    settingsbase.filename = filenamebase;
   }

   //测试2:测试将xml文件反序列化为子类实例。测试通过。只要xml文件的根节点的名字与被反序列化的类的名字一致即可。当然了,用基类的实例引用去指向反序列化后的派生类的实例也是没问题的。
   string filename = @"d:\myproject\deserializetest\deserializetest\bin\debug\gobalconfig\worldwind.xml";
   settingsbase settings;//当前了此处定义为worldwindsettings settings;也没问题
   type type = typeof(worldwindsettings);//因为xml文件的根节点名称是worldwindsettings,此处只能为worldwindsettings,而不能为settingsbase
   xmlserializer ser = new xmlserializer(type);
   using (textreader tr = new streamreader(filename))
   {
    //settings = (worldwindsettings)ser.deserialize(tr);//这两句代码都可以通过!
    settings = (settingsbase)ser.deserialize(tr);
    settings.filename = filename;
   }

   system.console.writeline("hello");
  }
 }
}

基类的xml文件:

<?xml version="1.0" encoding="utf-8"?>
<settingsbase>
 <filename>worldwind.xml</filename>
</settingsbase>

派生类的xml文件:

<?xml version="1.0" encoding="utf-8"?>
<worldwindsettings>
 <filename>worldwind.xml</filename>
 <proxyurl>www.baidu.com</proxyurl>
</worldwindsettings>

源码下载:deserializetest.rar 提取码:djpe

总结:将xml文件反序列化为类的实例的时候,只要xml文件的根节点的名字与被反序列化的类的名字一致即可。当然了,反序列化成功后,用基类的实例引用去指向反序列化后的派生类的实例也是没问题的。

其它注意事项:

如果在一个类中有静态的成员变量,则在该类调用构造函数实例化之前,会首先实例化静态的成员变量。

以上就是本次介绍的全部知识点内容,感谢大家的学习和对移动技术网的支持。

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网