XmlSerializer在命名空间using System.Xml.Serialization下。

序列化和反序列化的代码:

using System.IO;
using System.Xml;
using System.Xml.Serialization;
namespace ConsoleApplication1
{
public class PublicFunction
{
//序列化到XmlNode
public static void Serialize<T>(T t, out XmlNode node)
{
XmlDocument doc = new XmlDocument();
using (MemoryStream ms = new MemoryStream())
{
XmlSerializer serializer = new XmlSerializer(typeof(T), typeof(T).Assembly.GetName().Name);
serializer.Serialize(ms, t);
ms.Position = 0;
doc.Load(ms);
node = doc.LastChild;
}
}
//反序列化XmlNode中的数据
public static void DeSerialize<T>(XmlNode node, out T t)
{
XmlSerializer serializer = new XmlSerializer(typeof(T), typeof(T).Assembly.GetName().Name);
XmlNodeReader reader = new XmlNodeReader(node);
t=(T)serializer.Deserialize(reader);
} //序列化到文件
public static void SerializeFile<T>(T t, string filepath)
{
using(XmlWriter writer = new XmlTextWriter(filepath, Encoding.UTF8))
{
XmlSerializer serializer = new XmlSerializer(typeof(T));
serializer.Serialize(writer,t);
}
} //将文件中的内容反序列化
public static void DeSerializeFile<T>(string Filepath,out T t)
{
t = default(T);
using (XmlReader reader = new XmlTextReader(Filepath))
{
XmlSerializer serializer = new XmlSerializer(typeof(T));
serializer.Deserialize(reader);
}
}
}
}

XmlSerializer序列化规则:

1.只能序列化public成员变量,protected、private、public static 声明的字段都不支持序列化。

2.对象属性必须是可读可写。

3.对象必须要有一个无参构造函数,用于反序列化。

4.序列化的顺序和字段定义的顺序保持一致。

5.序列化子类,而声明的是基类时,需要在基类中使用XmlInclude声明子类类型,例如下面的listCCAbstract字段。

using System.Xml;
using System.Xml.Serialization;
using System.IO;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
Aa a = new Aa();
PublicFunction.SerializeFile<Aa>(a, @"D:\1.txt");
}
}
[XmlRoot("AaRoot")]
public class Aa
{
public static string StaticParam;
[XmlAttribute("Name")]
public string name; [XmlIgnore]
public string Ignore;
protected string proparam;
private int age;
public int pAttribute
{
get;
set;
}
[XmlArray("List")]
[XmlArrayItem("Item")]
public List<CCAbstract> listCCAbstract { get; set; } public Aa()
{
StaticParam = "StaticParam";
this.name = "Aa";
this.proparam = "Praparam";
this.age = 23;
pAttribute = 23;
Ignore = "Ignpore";
listCCAbstract = new List<CCAbstract> { new Cc("testCcAbstract") };
}
} [XmlInclude(typeof(Cc))]
public abstract class CCAbstract
{
} public class Cc:CCAbstract
{
public string CName;
public Cc()
{
}
public Cc(string name)
{
this.CName=name;
}
}
}

序列化后的xml内容为:

<?xml version="1.0" encoding="utf-8"?>
<AaRoot xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
Name="Aa">
<pAttribute>23</pAttribute>
<List>
<Item xsi:type="Cc">
<CName>testCcAbstract</CName>
</Item>
</List>
</AaRoot>

可以看到XmlRoot可以指定根结点名称,name不再作为XmlElement而是变成了AaRoot的属性。XmlIgnore标签标识的字段不进行序列化,protected、private、public static 声明的字段都不支持序列化。XmlArray可以指定List类型序列化后的名称,XmlArrayItem则对应List中的元素。

6.尽量使用XmlSerializer(Type)、XmlSerializer(Type,String)这两种构造函数,如果使用其它构造函数则会导致内存泄漏。

详情请看

https://msdn.microsoft.com/zh-cn/library/system.xml.serialization.xmlserializer(VS.80).aspx

为了提高性能,XML 序列化基础结构动态生成程序集,以便对指定类型进行序列化和反序列化。该基础结构将找到并重新使用这些程序集。仅当使用以下构造函数时,才会发生此行为:

System.Xml.Serialization.XmlSerializer(Type)

System.Xml.Serialization.XmlSerializer(Type,String)

如果使用任何其他构造函数,则将生成同一个程序集的多个版本,这些版本始终不予卸载,从而导致内存泄漏和性能低下。最简单的解决方案是使用上面两个构造函数中的一个。

XmlSerializer序列化的更多相关文章

  1. .NET调用外部接口将得到的List数据,并使用XmlSerializer序列化List对象成XML格式

    BidOpeningData.BidSupervisionSoapClient client = new BidOpeningData.BidSupervisionSoapClient(); Dict ...

  2. 使用XmlSerializer序列化可空属性

    使用XmlSerializer可以方便的将对象序列化为xml,实现应用之间的数据交互.但是XmlSerializer却不能很好地序列化类型中的可空字段. 例如,有如下定义的类Person: [Seri ...

  3. 学习C# XmlSerializer 序列化反序列化XML

    类.变量常用头: [XmlRootAttribute]:对根节点的描述,在类声明中使用 如:下例的Html类 [XmlType]:对节点描述,在类声明中使用         如:下例的Head类 [X ...

  4. C# XmlSerializer序列化浅析

    C# 中使用 XmlSerializer 实现类和xml文件的序列化和反序列化,使用起来非常简单. C# XmlSerializer实现序列化: XmlSerializer xml = new Xml ...

  5. C#调用XmlSerializer序列化时生成CDATA节点解决方法

    public class Person{    public string Name { get; set; }    public int Age { get; set; }        } 引用 ...

  6. C# 派生类的XmlSerializer序列化XML

    近段对XML 序列化进行处理,用XmlSerializer这个挺好用的. 但是对于派生类对象的XML的生成总会报错.因为同一个节点名称,不能反射为不同的对象.这个在网上找了好久,都说要利用反射来处理. ...

  7. XmlSerializer 对象的Xml序列化和反序列化

    http://www.cnblogs.com/yukaizhao/archive/2011/07/22/xml-serialization.html 这篇随笔对应的.Net命名空间是System.Xm ...

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

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

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

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

随机推荐

  1. 数据库路由中间件MyCat - 源代码篇(4)

    此文已由作者易国强授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 2. 前端连接建立与认证 Title:MySql连接建立以及认证过程client->MySql:1.T ...

  2. 管道/FIFO注意事项

    管道 1. 其本质是一个伪文件(实为内核缓冲区) 2. 由两个文件描述符引用,一个表示读端,一个表示写端. 3. 规定数据从管道的写端流入管道,从读端流出. 管道的原理: 管道实为内核使用环形队列机制 ...

  3. “全栈2019”Java异常第十章:throw与throws区别详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java异 ...

  4. 洛谷P5279 [ZJOI2019]麻将(乱搞+概率期望)

    题面 传送门 题解 看着题解里一堆巨巨熟练地用着专业用语本萌新表示啥都看不懂啊--顺便\(orz\)余奶奶 我们先考虑给你一堆牌,如何判断能否胡牌 我们按花色大小排序,设\(dp_{0/1,i,j,k ...

  5. css 实现关闭按钮 X

    .close::before { content: "\2716";} 然后就显示出来了 这里有个更直接的例子 <!DOCTYPE html> <html lan ...

  6. django入门-模型-part2

    尊重作者的劳动,转载请注明作者及原文地址 http://www.cnblogs.com/txwsqk/p/6511177.html 完全翻译自官方文档 https://docs.djangoproje ...

  7. JavaScript 函数声明,函数表达式,匿名函数的区别,深入理解立即执行函数(function(){…})()

    function fnName(){xxxx}; // 函数声明:使用function关键字声明一个函数,在指定一个函数名. //例如:(正常,因为 提升 了函数声明,函数调用可以在函数声明之前) f ...

  8. C++多线程编程二

    1. 死锁与解锁: #include <iostream> #include <thread> #include <mutex> using namespace s ...

  9. delphi 10.2 ----简单的叠乘例子

    unit Unit11; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, Syste ...

  10. C#-WebForm-Repeater的灵活运用、ItemCommand的用法-增删改查、如何不适用Repeater来展示数据?

    浏览器页面: 代码: <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Defau ...