C#中将xml文件反序列化为实例时采用基类还是派生类的知识点讨论
基类:
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Text;
namespaceDeserializeTest
{
publicclassSettingsBase
{
privatestringm_fileName;
publicstringFileName
{
get{returnm_fileName;}
set{m_fileName=value;}
}
}
}
派生类:
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Text;
namespaceDeserializeTest
{
publicclassWorldWindSettings:SettingsBase
{
publicWorldWindSettings()
:base()
{
}
privatestringm_proxyUrl="";
publicstringProxyUrl
{
get
{
returnm_proxyUrl;
}
set
{
this.m_proxyUrl=value;
}
}
}
}
主函数调用测试代码为:
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Text;
usingSystem.IO;
usingSystem.Xml.Serialization;
namespaceDeserializeTest
{
classProgram
{
staticvoidMain(string[]args)
{
//测试1:测试将xml文件反序列化为基类实例。测试通过。只要xml文件的根节点的名字与被反序列化的类的名字一致即可
stringfileNameBase=@"D:\MyProject\DeserializeTest\DeserializeTest\bin\Debug\GobalConfig\SettingsBase.xml";
SettingsBasesettingsBase;
XmlSerializerserBase=newXmlSerializer(typeof(SettingsBase));
using(TextReadertrBase=newStreamReader(fileNameBase))
{
settingsBase=(SettingsBase)serBase.Deserialize(trBase);
settingsBase.FileName=fileNameBase;
}
//测试2:测试将xml文件反序列化为子类实例。测试通过。只要xml文件的根节点的名字与被反序列化的类的名字一致即可。当然了,用基类的实例引用去指向反序列化后的派生类的实例也是没问题的。
stringfileName=@"D:\MyProject\DeserializeTest\DeserializeTest\bin\Debug\GobalConfig\WorldWind.xml";
SettingsBasesettings;//当前了此处定义为WorldWindSettingssettings;也没问题
Typetype=typeof(WorldWindSettings);//因为xml文件的根节点名称是WorldWindSettings,此处只能为WorldWindSettings,而不能为SettingsBase
XmlSerializerser=newXmlSerializer(type);
using(TextReadertr=newStreamReader(fileName))
{
//settings=(WorldWindSettings)ser.Deserialize(tr);//这两句代码都可以通过!
settings=(SettingsBase)ser.Deserialize(tr);
settings.FileName=fileName;
}
System.Console.WriteLine("Hello");
}
}
}
基类的XML文件:
WorldWind.xml
派生类的XML文件:
WorldWind.xml www.baidu.com
源码下载:DeserializeTest.rar提取码:djpe
总结:将xml文件反序列化为类的实例的时候,只要xml文件的根节点的名字与被反序列化的类的名字一致即可。当然了,反序列化成功后,用基类的实例引用去指向反序列化后的派生类的实例也是没问题的。
其它注意事项:
如果在一个类中有静态的成员变量,则在该类调用构造函数实例化之前,会首先实例化静态的成员变量。
以上就是本次介绍的全部知识点内容,感谢大家的学习和对毛票票的支持。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。