C# 使用XML序列化对象(二)
在C# 使用XML序列化对象(一)中描述了使用XML序列化对象的最简单的实现。
现在我们来看看稍微复杂一点的情况:
现有两个类:A和B,B是A的派生类,如下所示:
public class A
{
public int a
{
get;
set;
}
} public class B : A
{
public int b
{
get;
set;
}
}
如果使用C# 使用XML序列化对象(一)中的方法来直接序列化类B的实例,会抛下面的异常:
"不应是类型 B。使用 XmlInclude 或 SoapInclude 特性静态指定非已知的类型。"
解决办法一:
在类A上使用XmlInclude特性标记类B,如下所示:
[XmlInclude(typeof(B))]
public class A
{
public int a
{
get;
set;
}
} public class B : A
{
public int b
{
get;
set;
}
}
再使用如下代码序列化类B的实例:
B objB = new B
{
a = ,
b =
}; string xml = XmlSerialize(objB); var obj = XmlDeserialize<B>(txt.Text);
输出的XML如下所示:
<?xml version="1.0" encoding="utf-16"?>
<B xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<a>1</a>
<b>2</b>
</B>
当然,你也可以通过基类来序列化派生类,如下:
A objA = new B
{
a = 1,
b = 2
}; string xml = XmlSerialize(objA); var obj = XmlDeserialize<A>(txt.Text);
这种方式输出的XML如下所示:
<?xml version="1.0" encoding="utf-16"?>
<A xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xsi:type="B">
<a>1</a>
<b>2</b>
</A>
我们可以看到这里输出的XML里的标签名称是基类的名称,但是在属性中使用xsi:type="B"指定了对象的类型是派生类B。
还有另外一种方式可以不用在基类A上使用XmlInclude特性标记派生类B,如下:
public class A
{
public int a
{
get;
set;
}
} public class B : A
{
public int b
{
get;
set;
}
} A objA = new B
{
a = ,
b =
}; string xml = null;
XmlSerializer xs = new XmlSerializer(typeof(A), new Type[] { typeof(B) }); using (TextWriter tw = new StringWriter())
{
xs.Serialize(tw, objA);
xml = tw.ToString();
} object obj = null; using (TextReader tr = new StringReader(xml))
{
obj = xs.Deserialize(tr);
}
C# 使用XML序列化对象(二)的更多相关文章
- c#xml序列化对象,xml标记都缩写了
最近最后一个接口,他们的格式很严格必须是如下格式 <message> <age>20</age> <name>张三</name> </ ...
- C# 使用XML序列化对象(一)
在System.Xml.Serialization命名空间中提供了XML序列化类XmlSerializer用于将对象序列化为XML. 下面看一个最简单的例子: public class A { pub ...
- XmlSerializer 对象的Xml序列化和反序列化
http://www.cnblogs.com/yukaizhao/archive/2011/07/22/xml-serialization.html 这篇随笔对应的.Net命名空间是System.Xm ...
- XmlSerializer 对象的Xml序列化和反序列化,XMLROOT别名设置
这篇随笔对应的.Net命名空间是System.Xml.Serialization:文中的示例代码需要引用这个命名空间. 为什么要做序列化和反序列化? .Net程序执行时,对象都驻留在内存中:内存中 ...
- C#操作Xml:XmlSerializer 对象的Xml序列化和反序列化
这篇随笔对应的.Net命名空间是System.Xml.Serialization:文中的示例代码需要引用这个命名空间. 为什么要做序列化和反序列化? .Net程序执行时,对象都驻留在内存中:内存中的对 ...
- Windows phone 之XML序列化与反序列化
为什么要做序列化和反序列化? 一个回答: 我们都知道对象是不能在网络中直接传输的,不过还有补救的办法.XML(Extensible Markup Language)可扩展标记语言,本身就被设计用来存储 ...
- IOSerialize,xml和json,soap序列化器,二进制序列化器,XML序列化器,文件 检查、新增、复制、移动、删除
1 文件夹/文件 检查.新增.复制.移动.删除,2 文件读写,记录文本日志/读取配置文件3 三种序列化器4 xml和json1.文件夹/文件 检查.新增.复制.移动.删除,2 文件读写,记录文本日志/ ...
- 序列化对象为xml字符串
/// <summary> /// 序列化对象为xml字符串 /// </summary> /// <param name="obj" ...
- Android中序列化对象到XMl 和 XML反序列化为对象
package com.example.xmloperation; import java.io.File; import java.io.FileOutputStream; import java. ...
随机推荐
- C#连接MySql数据库的方法
1.要连接MySql数据库必须首先下载MySql的连接.net的文件, 文件下载地址为http://download.csdn.net/detail/xiaoliu123586/91455792.解压 ...
- phpcms v9 下拉菜单 二级 三级子栏目调用方法
很多网站的导航栏可以实现下拉二级菜单,三级菜单等效果,今天我们就来分享phpcms v9 支持下拉菜单的方法,可以支持无限子栏目调用,具体写法如下: <ul> {pc:content ac ...
- AMO olap Test C# generate tsql and mdx
通过AMO访问online的cube,生成等值的TSql和mdx 自动生成等值的TSQL和MDX进行Cube测试.其中难度比较大的部分是拼接TSQL. 暂时不处理calculations,只除理met ...
- 《TCP/IP 详解 卷一》读书笔记-----Ping&Traceroute
1.ping是用于测试对方主机是否可达的命令,其实本质上就是echo类型的ICMP报文.同时,ping还能用于计算RTT(round-trip time),即两台主机间的往返时延. 2.随着网络安全意 ...
- UESTC 1014 Shot
这题刚开始没想通,结果发现要解方程,代码如下: #include<iostream> #include<cstdio> #include<cmath> #inclu ...
- sql windows server2008 全套激活码
vs2012 - Microsoft Visual Studio Ultimate 2012 旗舰版 有效注册密钥: YKCW6-BPFPF-BT8C9-7DCTH-QXGWC- Microsoft ...
- win7系统电脑连接小米蓝牙音箱
一.买好蓝牙适配器,插到电脑上. 二.右下角工具栏找到蓝牙图标 三.右键这个图标,选择'显示Bluetooth设备' 四.找到小米蓝牙音箱 'NDZ-030-AA' 五.双击打开它,然后选择'服务'选 ...
- git review报错一例
在线上修改代码,最后使用git review提交代码审核的时候出现报错如下:[wangshibo@115~]$ vim testfile #修改代码[wangshibo@115~] ...
- WPF在XAML中Binding使用StringFormat属性
1. 绑定Currency, 如果没有字符的话, =后面需要先加入{}. 不加的话会出问题. 1 <TextBlock Text="{Binding Amount, StringFor ...
- yum标准化安装nginx最新版
yum标准化安装nginx最新版 cat > /etc/yum.repos.d/nginx.repo [nginx] name=nginx repo baseurl=http://nginx.o ...