XmlSerializer序列化
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序列化的更多相关文章
- .NET调用外部接口将得到的List数据,并使用XmlSerializer序列化List对象成XML格式
BidOpeningData.BidSupervisionSoapClient client = new BidOpeningData.BidSupervisionSoapClient(); Dict ...
- 使用XmlSerializer序列化可空属性
使用XmlSerializer可以方便的将对象序列化为xml,实现应用之间的数据交互.但是XmlSerializer却不能很好地序列化类型中的可空字段. 例如,有如下定义的类Person: [Seri ...
- 学习C# XmlSerializer 序列化反序列化XML
类.变量常用头: [XmlRootAttribute]:对根节点的描述,在类声明中使用 如:下例的Html类 [XmlType]:对节点描述,在类声明中使用 如:下例的Head类 [X ...
- C# XmlSerializer序列化浅析
C# 中使用 XmlSerializer 实现类和xml文件的序列化和反序列化,使用起来非常简单. C# XmlSerializer实现序列化: XmlSerializer xml = new Xml ...
- C#调用XmlSerializer序列化时生成CDATA节点解决方法
public class Person{ public string Name { get; set; } public int Age { get; set; } } 引用 ...
- C# 派生类的XmlSerializer序列化XML
近段对XML 序列化进行处理,用XmlSerializer这个挺好用的. 但是对于派生类对象的XML的生成总会报错.因为同一个节点名称,不能反射为不同的对象.这个在网上找了好久,都说要利用反射来处理. ...
- 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程序执行时,对象都驻留在内存中:内存中的对 ...
随机推荐
- Ubuntu 12.04 Openssh 安装过程
1.输入 apt-get install openssh-server 注意 出现依赖 需要使用 查看依赖是否需要,如果不需要可以直接删除,sudo apt-get remove XXXX 或者sud ...
- c++实验5 顺序/链式队列
链式队列及循环队列 1.循环队列的实现(请采用模板类及模板函数实现) [实现提示] 同时可参见教材p65-p67页的ADT描述及算法实现及ppt)函数.类名称等可自定义,部分变量请加上学号后3位.也可 ...
- 微信小程序下可以使用的MD5以及AES加密(通用)
两段代码都来自网络 ,在小程序下的加解密结果与CS/BS等算出的结果都一致,支持汉字. 一.MD5: var rotateLeft = function (lValue, iShiftBits) { ...
- LOJ#2039. 「SHOI2015」激光发生器(计算几何)
题面 传送门 题解 如果我初中科学老师知道我有一天计算的时候入射角不等于反射角不知道会不会把我抓起来打一顿-- 这题本质上就是个模拟,需要的芝士也就计蒜几盒的那点,不过注意细节很多,放到考场上只能看看 ...
- flask源码解析之DispatcherMiddleware
DispatcherMiddleware作用 实现多app的应用,完成路由分发的功能 如何使用 from werkzeug.wsgi import DispatcherMiddleware from ...
- django入门-表单-part4
尊重作者的劳动,转载请注明作者及原文地址 http://www.cnblogs.com/txwsqk/p/6514113.html 完全翻译自官方文档 https://docs.djangoproje ...
- QuantLib 金融计算——随机过程之概述
目录 QuantLib 金融计算--随机过程之概述 框架 用法与接口 如果未做特别说明,文中的程序都是 Python3 代码. QuantLib 金融计算--随机过程之概述 载入模块 import Q ...
- ThreadLocal系列(二)-InheritableThreadLocal的使用及原理解析
ThreadLocal系列之InheritableThreadLocal的使用及原理解析(源码基于java8) 上一篇:ThreadLocal系列(一)-ThreadLocal的使用及原理解析 下一篇 ...
- springcloud(八)-Hystrix熔断器
雪崩效应 在微服务架构中通常会有多个服务层调用,基础服务的故障可能会导致级联故障,进而造成整个系统不可用的情况,这种现象被称为服务雪崩效应.服务雪崩效应是一种因“服务提供者”的不可用导致“服务消费者” ...
- netty用户指南
Netty用户指南 一.前言 1.问题 当今世界我们需要使用通用的软件或库与其他组件进行通信,例如使用HTTP客户端从服务器中获取信息,或通过网络服务调用一个远程的方法.然而通用的协议及其实现通常不具 ...