这篇随笔对应的.Net命名空间是System.Xml.Serialization;文中的示例代码需要引用这个命名空间。

为什么要做序列化和反序列化?
.Net程序执行时,对象都驻留在内存中;内存中的对象如果需要传递给其他系统使用;或者在关机时需要保存下来以便下次再次启动程序使用就需要序列化和反序列化。
范围:本文只介绍xml序列化,其实序列化可以是二进制的序列化,也可以是其他格式的序列化。
看一段最简单的Xml序列化代码
1
2
3
4
5
6
7
8
9
10
11
12
class Program
{
    static void Main(string[] args)
    {
        int i = 10;
        //声明Xml序列化对象实例serializer
        XmlSerializer serializer = new XmlSerializer(typeof(int));
        //执行序列化并将序列化结果输出到控制台
        serializer.Serialize(Console.Out, i);
        Console.Read();
    }
}

上面代码对int i进行了序列化,并将序列化的结果输出到了控制台,输出结果如下

<?xml version="1.0" encoding="gb2312"?>
<int>10</int>

可以将上述序列化的xml进行反序列化,如下代码

static void Main(string[] args)
{using (StringReader rdr = new StringReader(@"<?xml version=""1.0"" encoding=""gb2312""?>
<int>10</int>")){//声明序列化对象实例serializer XmlSerializer serializer = new XmlSerializer(typeof(int));//反序列化,并将反序列化结果值赋给变量iint i = (int)serializer.Deserialize(rdr);//输出反序列化结果Console.WriteLine("i = " + i);Console.Read();}
}

以上代码用最简单的方式说明了xml序列化和反序列化的过程,.Net系统类库为我们做了大量的工作,序列化和反序列化都非常简单。但是在现实中业务需求往往比较复杂,不可能只简单的序列化一个int变量,显示中我们需要对复杂类型进行可控制的序列化。

自定义对象的Xml序列化:

System.Xml.Serialization命名空间中有一系列的特性类,用来控制复杂类型序列化的控制。例如XmlElementAttribute、XmlAttributeAttribute、XmlArrayAttribute、XmlArrayItemAttribute、XmlRootAttribute等等。

看一个小例子,有一个自定义类Cat,Cat类有三个属性分别为Color,Saying,Speed。

namespace UseXmlSerialization
{class Program{static void Main(string[] args){//声明一个猫咪对象var c = new Cat { Color = "White", Speed = 10, Saying = "White or black,  so long as the cat can catch mice,  it is a good cat" };//序列化这个对象XmlSerializer serializer = new XmlSerializer(typeof(Cat));//将对象序列化输出到控制台serializer.Serialize(Console.Out, c);Console.Read();}}[XmlRoot("cat")]public class Cat{//定义Color属性的序列化为cat节点的属性[XmlAttribute("color")]public string Color { get; set; }//要求不序列化Speed属性[XmlIgnore]public int Speed { get; set; }//设置Saying属性序列化为Xml子元素[XmlElement("saying")]public string Saying { get; set; }}
}

可以使用XmlElement指定属性序列化为子节点(默认情况会序列化为子节点);或者使用XmlAttribute特性制定属性序列化为Xml节点的属性;还可以通过XmlIgnore特性修饰要求序列化程序不序列化修饰属性。

对象数组的Xml序列化:

数组的Xml序列化需要使用XmlArrayAttribute和XmlArrayItemAttribute;XmlArrayAttribute指定数组元素的Xml节点名,XmlArrayItemAttribute指定数组元素的Xml节点名。

如下代码示例:

/*玉开技术博客 http://www.cnblogs.com/yukaizhao */
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Serialization;namespace UseXmlSerialization
{class Program{static void Main(string[] args){//声明一个猫咪对象var cWhite = new Cat { Color = "White", Speed = 10, Saying = "White or black,  so long as the cat can catch mice,  it is a good cat" };var cBlack = new Cat { Color = "Black", Speed = 10, Saying = "White or black,  so long as the cat can catch mice,  it is a good cat" };CatCollection cc = new CatCollection { Cats = new Cat[] { cWhite,cBlack} };//序列化这个对象XmlSerializer serializer = new XmlSerializer(typeof(CatCollection));//将对象序列化输出到控制台serializer.Serialize(Console.Out, cc);Console.Read();}}[XmlRoot("cats")]public class CatCollection{[XmlArray("items"),XmlArrayItem("item")]public Cat[] Cats { get; set; }}[XmlRoot("cat")]public class Cat{//定义Color属性的序列化为cat节点的属性[XmlAttribute("color")]public string Color { get; set; }//要求不序列化Speed属性[XmlIgnore]public int Speed { get; set; }//设置Saying属性序列化为Xml子元素[XmlElement("saying")]public string Saying { get; set; }}
}

以上代码将输出:

<?xml version="1.0" encoding="gb2312"?>
<cats xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://ww
w.w3.org/2001/XMLSchema"><items><item color="White"><saying>White or black,  so long as the cat can catch mice,  it is a good
cat</saying></item><item color="Black"><saying>White or black,  so long as the cat can catch mice,  it is a good
cat</saying></item></items>
</cats>

XmlSerializer内存泄漏问题:

多谢chenlulouis,仔细看了下msdn,确实存在泄漏的情况,msdn说明如下:

动态生成的程序集 

为了提高性能,XML 序列化基础结构将动态生成程序集,以序列化和反序列化指定类型。此基础结构将查找并重复使用这些程序集。此行为仅在使用以下构造函数时发生:

XmlSerializer(Type) 
XmlSerializer.XmlSerializer(Type, String)

如果使用任何其他构造函数,则会生成同一程序集的多个版本,且绝不会被卸载,这将导致内存泄漏和性能降低。最简单的解决方案是使用先前提到的两个构造函数的其中一个。否则,必须在 Hashtable 中缓存程序集,如以下示例中所示。

也就是说我们在使用XmlSerializer序列化,初始化XmlSerializer对象时最好使用下面两个构造函数否则会引起内存泄漏。
XmlSerializer(Type)
XmlSerializer.XmlSerializer(Type, String)

C#处理Xml的相关随笔:

转载于:https://www.cnblogs.com/goody9807/p/3934892.html

XmlSerializer 对象的Xml序列化和反序列化,XMLROOT别名设置相关推荐

  1. 开心网外挂开发之 XML序列化于反序列化

    通过昨天的文章我们已经了解了开发一个开心网的外挂所需要的最基本的东本,接下来的工作可以说基本上就上围绕这个基础来进行的,我写这一系列文章主要的目地不仅仅是为了让大家了解怎么开发开心网外挂,最主要的目过 ...

  2. XML 序列化与反序列化

    XML序列化与反序列化 1.将一个类转化为XML文件 /// <summary>/// 对象序列化成XML文件/// </summary>/// <param name= ...

  3. Xml序列化、反序列化帮助类

    之前从网络上找了一个Xml处理帮助类,并整理了一下,这个帮助类针对Object类型进行序列化和反序列化,而不需要提前定义Xml的结构,把它放在这儿供以后使用 1 /// <summary> ...

  4. oracle存储过程如何传递一个bean对象_对象传输,序列化和反序列化

    一.前言 二.基本概念 2.1 序列化和反序列化的定义及最重要的作用 序列化的定义:Java序列化就是指把Java对象转换为字节序列的过程: 反序列化的定义:Java反序列化就是指把字节序列恢复为Ja ...

  5. 序列化对象C++对象的JSON序列化与反序列化探索

    新手发帖,很多方面都是刚入门,有错误的地方请大家见谅,欢迎批评指正 一:背景 作为一名C++开发人员,我始终很期待能够像C#与JAVA那样,可以省力的进行对象的序列化与反序列化,但到现在为止,还没有找 ...

  6. IO流 (五) ----- 对象数据的序列化与反序列化

    相关文章: <IO流 (一) ----- 基本概念和File类> <IO流 (二) ----- 文件流> <IO流 (三) ----- 字符流和字符缓冲流> < ...

  7. XML序列化和反序列化(C#)

    主要参考资料: http://www.codeproject.com/Articles/483055/XML-Serialization-and-Deserialization-Part-1 http ...

  8. [WPF]xml序列化以及反序列化数据

    代码 XML序列化工具类 public static class XMLHelper{/// <summary>/// 将对象序列化为指定的文件名/// </summary>/ ...

  9. C# XML 序列化 及 反序列化

    百科:序列化 (Serialization)将对象的状态信息转换为可以存储或传输的形式的过程.在序列化期间,对象将其当前状态写入到临时或持久性存储区.以后,可以通过从存储区中读取或反序列化对象的状态, ...

最新文章

  1. LeetCode简单题之二叉树的层平均值
  2. Oracle配置监听要注意的地方
  3. 2019年春季学期第九周作业
  4. Netty工作笔记0016---Buffer的分散和聚合
  5. img内联块元素的操作
  6. VSCODE: 快速生成html框架
  7. C语言实训设计——疫情健康打卡系统
  8. php h5 调用摄像头_怎样使用H5调用摄像头
  9. Localhost到底是干什么用的?
  10. ubuntu文件格式转换
  11. 转帖:励建书:数学有助于大众理性思维的培养
  12. wkhtmltopdf使用指南,html转图片,转pdf
  13. flex布局的应用 —— 模仿携程移动端的首页
  14. SSM+mysql+微信小程序网易云音乐设计与实现 毕业设计-附源码261620
  15. Java web speach api_HTML5 Web Speech API,让网站更有趣
  16. 回溯算法:从电影《蝴蝶效应》中学习回溯算法的核心思想
  17. Java实现手机号码归属地
  18. php检测wifi,WFilter插件 - 随身wifi和私接路由检测
  19. 安卓day29网络编程 HttpClient AsyncHttpClient 断点续传多线程下载器 HttpUtils
  20. java操作word循环动态添加表格Table使用poi-tl的LoopRowTableRenderPolicy

热门文章

  1. [转载]数据结构笔试题基础
  2. 正则查找倒数第二个符合条件的字符串_EXCEL正则表达式的基础语法
  3. Google C++单元测试框架(Gtest)系列教程之一——入门
  4. 一个最简单的Makefile例子(转)
  5. 字典树 ZOJ1109 HDU1251 PKU1204 HDU1075
  6. java 两个字段排序,如何在Java中按两个字段排序?
  7. java web 静态_「Java Web」主页静态化的实现
  8. Matlab求重复数字的个数tabulate
  9. 汽车电子专业知识篇(一)-汽车行业质量人必知的41个体系术语
  10. 少儿编程100讲轻松学python(十一)-python如何保留小数点位数