• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

C#中将xml文件反序列化为实例时采用基类还是派生类的问题

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

基类:

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    提取码:pkya 

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


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
C#电脑发送短信发布时间:2022-07-14
下一篇:
C#和TS/JS的对比学习02:函数与方法发布时间:2022-07-14
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap