C#中将xml文件反序列化为实例时采用基类还是派生类的知识点讨论
作者:rainbow70626 发布时间:2022-08-04 19:27:32
标签:C#,xml,反序列化
基类:
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文件的根节点的名字与被反序列化的类的名字一致即可。当然了,反序列化成功后,用基类的实例引用去指向反序列化后的派生类的实例也是没问题的。
其它注意事项:
如果在一个类中有静态的成员变量,则在该类调用构造函数实例化之前,会首先实例化静态的成员变量。
来源:https://www.cnblogs.com/rainbow70626/p/11839330.html
0
投稿
猜你喜欢
- 博主说:有时候,我们需要对数据库中现有的数据进行大量处理操作(例如表中的某个字段需要全部更新等),如果直接使用select * from t
- Spring @Order进行排序直接上代码public class OrderAnnotationTest { &
- 新手学习记录。写在springboot test 示例 示例代码地址看结尾。后面有带页面的示例。SpringBoot Test无
- 一. 线性表中的顺序表线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构,常见
- 在 Effecitve Java 一书的第 48 条中提到了双重检查模式,并指出这种模式在 Java 中通常并不适用。该模式的结构如下所示:
- 一、项目简述功能包括(管理员和用户角色): 酒店预订,酒店管理,员工管理,入住原理,订单管理, 楼层管理,退房管理,营业额报表等等。二、项目
- 从Java 5开始,Java语言对方法参数支持一种新写法,叫 可变长度参数列表,其语法就是类型后跟...,表示此处接受的参数为0到多个Obj
- feign对象传参和普通传参及遇到的坑对象传参使用@RequestBody来指定传参对象@RequestMapping(value = &q
- synchronized关键字,一般称之为”同步锁“,用它来修饰需要同步的方法和需要同步代码块,默认是当前对象作为锁的对象。同步锁锁的是同一
- WebService是一种跨编程语言和跨操作系统平台的远程调用技术所谓远程调用,就是一台计算机a上的一个程序可以调用到另外一台计算机b上的一
- @JsonInclude(JsonInclude.Include.NON_NULL)不起作用记录一下使用@JsonInclude(JsonI
- 前言本文以用户名/密码验证方式为例,讲解 Spring Security 的认证流程,在此之前,需要你了解 Spring Security
- 本文实例讲述了C#模式画刷HatchBrush用法。分享给大家供大家参考。具体如下:using System;using System.Co
- 1、public String(char[] c,begin,length).从字符数组c的下标begin处开始,将长度为length的字符
- 本文实例讲述了Java删除二叉搜索树最大元素和最小元素的方法。分享给大家供大家参考,具体如下:在前面一篇《Java二叉搜索树遍历操作》中完成
- google benchmark已经为我们提供了类似的功能,而且使用相当简单。具体的解释在后面,我们先来看几个例子,我们人为制造几个时间复杂
- 一、什么是队列队列是一个有序列表,可以用数组或者链表来实现。遵循先入先出的原则,即:先存入队列的数据,要先取出。后存入的的数据,后取出。看一
- 一、简介约瑟夫问题(有时也称为约瑟夫斯置换,是一个出现在计算机科学和数学中的问题。在计算机编程的算法中,类似问题又称为约瑟夫环。又称“丢手绢
- 1. 定义在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。2. 使用的
- 什么是 MyBatis ?MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有