原文 www.cnblogs.com/mgen/archive/2011/12/03/2275014.html

注意:

运行代码请注意添加如下命名空间:

using System.Xml;

using System.Xml.Serialization;

using System.IO;

返回目录

1. 针对基类的XmlSerializer序列化派生类

派生类将会序列化成这样的XML:

<基类名称xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns:xsd="http://www.w3.org/2001/XMLSchema"

xsi:type="派生类名称">

<!-- 基类和派生类的内容 -->

</基类名称>

第一种方法是在基类添加XmlInclude特性,这样的话基类的XmlSerializer可以序列化派生类了。

代码:

//基类加入XmlInclude

[XmlInclude(typeof(b))]

publicclassa

{

publicint aaa;

}

publicclassb : a

{

publicint bbb;

}

classProgram

{

staticvoid Main()

{

var xs =newXmlSerializer(typeof(a));

using (var textWriter =newStringWriter())

{

xs.Serialize(textWriter, newb());

Console.WriteLine(textWriter);

}

}

}

输出XML:

<axmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns:xsd="http://www.w3.org/2001/XMLSchema"

xsi:type="b">

</aaa>

</bbb>

</a>

第二种方法就是在XmlSerializer的构造函数内指定派生类型,然后序列化,这样就不用在基类上加入XmlInclude特性了。

代码:

//无需加入XmlInclude

publicclassa

{

publicint aaa;

}

publicclassb : a

{

publicint bbb;

}

classProgram

{

staticvoid Main()

{

var xs =newXmlSerializer(typeof(a), newType[] { typeof(b) });

using (var textWriter =newStringWriter())

{

xs.Serialize(textWriter, newb());

Console.WriteLine(textWriter);

}

}

}

输出和上面一样!

返回目录

2. 类内成员是派生类的序列化

还是上面的类a和b,现在再加入一个c类,这个c类中有一个a的对象:

publicclassa

{

publicint aaa;

}

publicclassb : a

{

publicint bbb;

}

publicclassc

{

publica objA =newa();

}

此时直接XML序列化一个c对象,结果是这样的XML:

<cxmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns:xsd="http://www.w3.org/2001/XMLSchema">

<objA>

</aaa>

</objA>

</c>

下面搞得复杂些,把c中的a对象改成这样:

publicclassc

{

publica objA =newb();

}

此时仿佛又回到了文章第一个标题,如果直接序列化c的话,会抛出异常。那么按照上面第一个方法,先在a上加入XmlInclude特性,然后再序列化c对象。

全部代码:

[XmlInclude(typeof(b))]

publicclassa

{

publicint aaa;

}

publicclassb : a

{

publicint bbb;

}

publicclassc

{

publica objA =newb();

}

classProgram

{

staticvoid Main()

{

var xs =newXmlSerializer(typeof(c));

using (var textWriter =newStringWriter())

{

xs.Serialize(textWriter, newc());

Console.WriteLine(textWriter);

}

}

}

输出XML(根节点c省略):

<objAxsi:type="b">

</aaa>

</bbb>

</objA>

和标题1的第一个方法类似!

但是标题1的第二个方法在这里没法使用的,因为c类和b类没有任何继承关系,在针对c的XmlSerializer不可能加入b的类型。这里其实还 有一种方法,加入XmlElement特性,其中ElementName属性是最终的Xml元素名称,而Type属性是针对的类型,这里加入b类型,不过 最好把a类型也加入(因为字段类型是a,有可能被赋值为a的对象)。

全部代码:

//不需要加XmlInclude

publicclassa

{

publicint aaa;

}

publicclassb : a

{

publicint bbb;

}

publicclassc

{

[XmlElement(ElementName ="b", Type =typeof(b))]

[XmlElement(ElementName ="a", Type =typeof(a))]

publica objA =newb();

}

classProgram

{

staticvoid Main()

{

var xs =newXmlSerializer(typeof(c));

using (var textWriter =newStringWriter())

{

xs.Serialize(textWriter, newc());

Console.WriteLine(textWriter);

}

}

}

生成XML:

<cxmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns:xsd="http://www.w3.org/2001/XMLSchema">

<b>

</aaa>

</bbb>

</b>

</c>

 

作者:Mgen
出处:www.cnblogs.com/mgen

其他参考页面:我的软件和工程博客导读

.NET(C#):XML序列化时派生类的处理的更多相关文章

  1. c# 中xml序列化时相同节点存入不同类型值

    先上需要序列话的类定义: [System.Xml.Serialization.XmlIncludeAttribute(typeof(DescriptionType))] [System.CodeDom ...

  2. XML序列化反序列化—常用类

    public class XMLSerializer    {        #region (public) xml序列化        /// <summary>        /// ...

  3. 在XML序列化时去除默认命名空间xmlns:xsd和xmlns:xsi

    摘 自: http://blog.csdn.net/fxhflower/article/details/7276820 可使用以下代码: //Create our own namespaces for ...

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

    基类: using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ...

  5. .NET中XML序列化和反序列化常用类和用来控制XML序列化的属性总结(XmlSerializer,XmlTypeAttribute,XmlElementAttribute,XmlAttributeAttribute,XmlArrayAttribute...)

    序列化和反序列化是指什么? 序列化(seriallization): 将对象转化为便于传输的数据格式, 常见的序列化格式:二进制格式,字节数组,json字符串,xml字符串.反序列化(deserial ...

  6. 关于C# XML序列化的一个BUG的修改

    关于C# XML序列化的一个BUG的修改 在我前一篇博客中提到用XML序列化作为数据库的一个方案,@拿笔小心 提到他们在用XML序列化时,遇到了一个比较严重的bug,即XML不闭合,系统不能正确的加载 ...

  7. Windows phone 之XML序列化与反序列化

    为什么要做序列化和反序列化? 一个回答: 我们都知道对象是不能在网络中直接传输的,不过还有补救的办法.XML(Extensible Markup Language)可扩展标记语言,本身就被设计用来存储 ...

  8. C#操作Xml:XmlSerializer 对象的Xml序列化和反序列化

    这篇随笔对应的.Net命名空间是System.Xml.Serialization:文中的示例代码需要引用这个命名空间. 为什么要做序列化和反序列化? .Net程序执行时,对象都驻留在内存中:内存中的对 ...

  9. Xml 序列化

    1 XML序列化只能序列化对象的公有属性,并且要求对象有一个无参的构造方法,否者无法反序列化. 2 [Serializable]和[NonSerialized]特性对XML序列化无效!所以使用XML序 ...

随机推荐

  1. TCP/IP详解之:ICMP协议

    ICMP协议: ICMP是IP层的一个组成部分,ICMP报文是在IP数据报内部被传输的,用于在IP主机.路由器之间传递控制消息.控制消息是指网络不通.主机是否可达.路由是否可用等网络本身的消息.这些控 ...

  2. C语言处理CSV文件的方法(二)

    strtok函数的使用是一个老生常谈的问题了.该函数的作用很大,争议也很大.以下的表述可能与一些资料有区别或者说与你原来的认识有差异,因此,我尽量以实验为证.交代一下实验环境是必要的,win7+vc6 ...

  3. JavaWeb核心编程之Tomcat安装和配置

    什么是JavaWeb 在Sun的Java Servlet规范中, 对Java Web应用做了这样的定义: "Java Web应用由一组Servlet, HTML页面, 类, 以及其他可以被绑 ...

  4. 关于 MyBatis MyBatis-Spring Jdbc 批量插入的各种比较分析

    因为目前SME项目中编写了一套蜘蛛爬虫程序,所以导致插入数据库的数据量剧增.就项目中使用到的3种DB插入方式进行了一个Demo分析: 具体代码如下: 1: MyBatis 开启Batch方式,最普通的 ...

  5. swift 创建tableView并实现协议

    // // ViewController2.swift // swift_helloword // // Created by Charlie on 15/7/13. // Copyright (c) ...

  6. 关于C语言中结构体中的结构体成员导致的字节对齐问题

    关于结构体的字节对齐是什么,就不赘述,再此附上一篇文章,介绍字节对齐:http://www.linuxsong.org/2010/09/c-byte-alignment/ 这里的结构体字节对齐的数据类 ...

  7. 轻奢当道业绩逆势增长 Kate Spade联手韩国衣恋开拓中国市场_商场报道_中国时尚品牌网

    轻奢当道业绩逆势增长 Kate Spade联手韩国衣恋开拓中国市场_商场报道_中国时尚品牌网 轻奢当道业绩逆势增长 Kate Spade联手韩国衣恋开拓中国市场

  8. JAVA Layout

    /**  * baidu :组件不会直接放到框架上,而是放在若干个面板上,这些面板再放到窗格上?  * 实际上在JFrame上可直接添加Jbutton  *   * BorderLayout Flow ...

  9. 截取字符串一之substr

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. iOS定位功能

    1.实现定位功能需要导入系统库MapKit.framework 2.在iPhone手机上默认是禁止手机定位的,所以,要询问系统是否开启手机定位功能. 为了开启手机定位功能,还需在info.plist中 ...