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

这篇随笔对应的.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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/376707.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++智能指针使用指南 part2:智能指针本身的方法以及使用建议

目录往期文章智能指针本身的方法对于unique_ptr对于shared_ptr对于weak_ptr使用建议1、使用工厂函数而非new构造对象2、在类内部调用其他类的方法3、在某类内部将当前对象指针共享给其他对象4、 智能指针只能管理堆对象&#xff0c;不能管理栈上对象5、不能将this指针直接托管给…

“/”应用程序中的服务器错误。

运行时错误 说明: 服务器上出现应用程序错误。此应用程序的当前自定义错误设置禁止远程查看应用程序错误的详细信息(出于安全原因)。但可以通过在本地服务器计算机上运行的浏览器查看。 详细信息: 若要使他人能够在远程计算机上查看此特定错误消息的详细信息&#xff0c;请在位…

JAVA_Collection容器

因为项目的需要&#xff0c;今天抽时间把JAVA中的容器复习了一下&#xff0c;为了以后的不时之需&#xff0c;现在把它记下来。 容器有其名&#xff0c;知其意&#xff0c;用来盛放数据的集合&#xff0c;JAVA中为我们提供了三种容器类&#xff1a;set、list、map&#xff0c;三…

对于enable_shared_from_this、shared_from_this使用笔记

文章为转载汇总 参考&#xff1a;C11标准库的一个工具类enable_shared_from_this的作用及原理分析 从这篇文章中可以知道&#xff1a; 当一个类public继承enable_shared_from_this时&#xff0c;会获得一个共有方法shared_from_this&#xff1a; class T : public enable_shar…

db file sequential read 事件的优化(一)

db file sequential read 事件的优化&#xff08;一&#xff09; db file sequential read等待事件有3个参数&#xff1a;file&#xff03;&#xff0c;first block&#xff03;&#xff0c;和block数量。在10g中&#xff0c;这等待事件受到用户I/O等待级别的影响。当处理db fi…

2014-08-26 遇到的小问题

不能快速的保存bug的确是很不爽的事情 &#xff0c;不仅客户着急 领导也着急 &#xff0c;自己也着急。。。。。。。。哈哈 原来好好的一个平台 简单的一个插入记录 突然就报错了 错误为 could not insert #9521 原来项目是用 NHibernate 做的插入 抛出的异常 真是无法定位到底…

Fatal error: Please read “Security“ section of the manual to find out how to run mysqld as root

.通过在命令后面加上–userroot 进行强制使用root账号启动。 cd /etc/init.d mysqld --userroot 参考&#xff1a; https://blog.csdn.net/huo_wa/article/details/117550307?spm1001.2101.3001.6650.2&utm_mediumdistribute.pc_relevant.none-task-blog-2%7Edefault%7ECT…

取消cp别名'cp -i'(unalias)

在rhel4updae8系统是使用cp命令覆盖文件总是提示要输入yes或no&#xff0c;即使加上-f参数也无法强行覆盖。[2] 方法一&#xff1a; 输入alias命令&#xff0c;看到系统内部使用的是cp的别名。 #alias alias cpcp -i 输入unalias cp命令&#xff0c;解除别名。 unalias cp #&…

增加swap分区

在确定了服务器所需要使用的内存后&#xff0c;需要增加1024M的swap空间 具体操作&#xff1a; 1、dd if/dev/zero of/tmp/swap bs1M count1024M #创建1024M的文件块 2、mkswap /tmp/swap #创建swap文件 3、swapon /tmp/swap #激活swap文件 4、swapon -s #查看swap 5、修改…

python 实现 topk算法

这里的版本是针对的一个class的某一个成员变量进行的&#xff1a; 关于如何定义对象的比较方法&#xff0c;请参考往期文章&#xff1a;python定义对象的比较方法 class province_room_quality_data:def __init__(self, room, quality):self.room roomself.quality qualityd…

2013年,未知的旅程

去年就开始策划要辞职到外面去闯一闯&#xff0c;今年年初在上一家公司毅然辞职了&#xff0c;理由是自己需要出去锻炼锻炼。 带着一个月的工资&#xff0c;和一点积蓄&#xff0c;还有一个女朋友来到了这个我以前都没有来过的城市-深圳。 听好多人都说过深圳是个好地方&#x…

SQL基础

经过这几天我才发现原来我最弱的是数据库&#xff0c;好了现在就来补补吧 SQL(Struct Query Language) 结构化查询语言&#xff0c;属于第四代语言&#xff08;接近于自然语言&#xff09;符合主谓宾定状补 DDL (Data Define L)数据定义语言,创建一个数据库&#xff0c;创建一个…

主成分分析资料

推荐一份介绍主成分分析的资料&#xff1a;http://www.cs.otago.ac.nz/cosc453/student_tutorials/principal_components.pdf&#xff0c;写的很好&#xff01; 在R语言中使用PCA&#xff1a;http://www.cnblogs.com/bigshuai/archive/2012/06/18/2553808.html 转载于:https://…

关于mysql的binlog写满磁盘而导致mysql无法连接的问题。

问题描述与追踪 首先是mysql连不上&#xff1a; [rootVM-90-225-centos ~]# mysql -uroot -p Enter password: ERROR 2002 (HY000): Cant connect to local MySQL server through socket /var/lib/mysql/mysql.sock (111)然后查看mysql的状态&#xff1a; [rootVM-90-225-c…

.NET系统架构改造的经验和教训

转自&#xff1a; http://robbinfan.com/blog/43/rid-off-dotnet-experience 在互联网行业&#xff0c;基于Unix/Linux的网站系统架构毫无疑问是当今主流的架构解决方案&#xff0c;这不仅仅是因为Linux本身足够的开放性&#xff0c;更因为围绕传统Unix/Linux社区有大量的成熟开…

yum error :No module named yum

Yum&#xff08;全称为 Yellow dog Updater, Modified&#xff09;是一个在Fedora和RedHat以及SUSE、CentOS中的Shell前端软件包管理器。基於RPM包管理&#xff0c;能够从指定的服务器自动下载RPM包并且安装&#xff0c;可以自动处理依赖性关系&#xff0c;并且一次安装所有依赖…

403报错解决方案

403报错解决方案 服务器使用yum install httpd时出现403报错&#xff0c;参考了几个文章&#xff1a; 首先根据这篇文章&#xff1a; devcloud上yum install 安装软件报错403 打开 /root/.bashrc 文件&#xff0c;然后在最末尾可以看到 no_proxy&#xff1a; export no_pr…

控制器中获取Field值

在ASP.NET MVC程序中&#xff0c;我们需要POST Data到制器中&#xff0c;是有很多方法。但是我们想在控制器中&#xff0c;获取Feild值呢&#xff1f;怎样获取&#xff1f;你可以留意到有一个类FormCollection。它能帮助到我们解决这个问题。 举个简单的例子。在ASP.NET MVC应用…