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. ...
随机推荐
- Hadoop 文件的数量怎么比block的数量多?
Total files: 23 Total symlinks: 0 Total blocks (validated): 22 (avg. block size 117723 ...
- Shell basic1
A shell script is a text file that typically begins with a shebang, as follows: #!/bin/bash /bin/bas ...
- TSQL点滴
Q1.什么是bookmark lookup? 非聚集索引中叶结点存储的是index keyword 和 rowid(heap table) 或 clusterindex key. 如果查询使用了非聚集 ...
- [转] KVM Internals, code and more
KVM Kernel-based Virtual Machine Internals, code and more http://slides.com/braoru/kvm#/ What behind ...
- 【实践】jdbc批量插入数据
参考文献:http://my.oschina.net/u/1452675/blog/203670 http://superjavason.iteye.com/blog/255423 /*测试批量写入数 ...
- POJ 3225 Help with Intervals --线段树区间操作
题意:给你一些区间操作,让你输出最后得出的区间. 解法:区间操作的经典题,借鉴了网上的倍增算法,每次将区间乘以2,然后根据区间开闭情况做微调,这样可以有效处理开闭区间问题. 线段树维护两个值: cov ...
- Android Studio运行程序出现Session ‘app’: Error Launching activity 解决办法
session "app":error launching activity 一下两种方法,可以轻松解决: 1. 2.把复选框去除:
- 【hibernate】<第二节>hibernate的一对多映射(基本类型)
所需工具与前文一致! 第一部分内容:基本类型的一对多(one to many) 以部门表与员工表为例: 目录结构: hibernate.cfg.xml内容 <?xml version=" ...
- iOS单例模式(Singleton)写法简析
单例模式的意思就是只有一个实例.单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个类称为单例类. 1.单例模式的要点: 显然单例模式的要点有三个:一是某个类只能有一个实例: ...
- 【C#】【Thread】上下文同步域SynchronizationAttribute
上下文同步:使用SynchronizationAttribute为ContextBoundObject对象创建一个简单的自动的同步. 这种同步方式仅用于实例化的方法和域的同步.所有在同一个上下文域的对 ...