程序集:System.Xml.Serialization(在 System.Xml.Serialization.dll 中)

命名空间:System.Xml.Serialization

公共函数代码:

         /// <summary>
///序列化
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="serialObject"></param>
/// <returns></returns>
public static string XmlSerializer<T>(T serialObject) where T : class
{
var emptyNamepsaces = new XmlSerializerNamespaces(new[] { XmlQualifiedName.Empty });
var serializer = new XmlSerializer(serialObject.GetType());
var settings = new XmlWriterSettings();
settings.OmitXmlDeclaration = true;
settings.Encoding = Encoding.UTF8;
using (var stream = new StringWriter())
using (var writer = XmlWriter.Create(stream, settings))
{
serializer.Serialize(writer, serialObject, emptyNamepsaces);
return stream.ToString();
}
} /// <summary>
///反序列化
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="xml"></param>
/// <returns></returns>
public static T DeserializeObject<T>(string xml) where T : class
{
using (var str = new StringReader(xml))
{
var xmlSerializer = new XmlSerializer(typeof(T));
var result = (T)xmlSerializer.Deserialize(str);
return result;
}
}
  1. XmlSerializerNamespaces 包含的 XML 命名空间必须符合称为的 www.w3.org 规范,XML 命名空间,而XmlQualifiedName.Empty表示无XML限定名。
  2. XmlSerializer(Type):初始化 XmlSerializer 类的新实例,该类可以将指定类型的对象序列化为 XML 文档,也可以将 XML 文档反序列化为指定类型的对象。(应用程序通常定义若干类,XmlSerializer 将这些类转换为单个 XML 实例文档。 但是,XmlSerializer 只需知道一种类型,即表示 XML 根元素的类的类型。 XmlSerializer 自动序列化所有从属类的实例。 同样,反序列化仅需要 XML 根元素的类型)。
  3. XmlWriterSettings:使用XmlWriterSettings实例对象进行生成的XML的设置。如是否缩进文本、缩进量、每个节点一行等配置(另:XmlReaderSettings代替XmlValidatingReader可用于XML验证)。

性能建议:

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

  1. XmlSerializer(Type)
  2. XmlSerializer.XmlSerializer(Type, String)

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

举例说明:

  新建一个订单类一个订单明细类,如图:

  

  实例化并添加属性值: 

 List<OrderDetail> orderDetail = new List<OrderDetail> {

 new OrderDetail{ ID=, ItemNum=, ItemPrice=,OrderDetailID="L001001", OrderDetailItem="电视机", OrderDetailMark="挂账", OrderID="L001" },

 new OrderDetail{ ID=, ItemNum=, ItemPrice=,OrderDetailID="L001002", OrderDetailItem="肥皂", OrderDetailMark="挂账", OrderID="L001" },

 new OrderDetail{ ID=, ItemNum=, ItemPrice=0.05M,OrderDetailID="L001003", OrderDetailItem="方便袋", OrderDetailMark="挂账", OrderID="L001" }

 };

 Order order = new Order { ID = , OrderDate = DateTime.Now, OrderID = "L001", OrderTax = true, OrderTotal = 200.05M, orderDetails = orderDetail };

  然后调用序列化方法如下:

 //序列化

 string xml = XMLSerializer.XmlSerializer<Order>(order);

 Console.WriteLine("-------------------------------------------");

 Console.WriteLine(xml);

 Console.WriteLine("-------------------------------------------");

  结果如图:

  

  继续进行反序列化,代码如:

//反序列化

Order dOrder = XMLSerializer.DeserializeObject<Order>(xml);

Console.WriteLine("订单有明细:"+dOrder.orderDetails.Count+"项,共计:"+dOrder.OrderTotal+"元");

Console.WriteLine("编号\t名称\t单价");

foreach (var item in dOrder.orderDetails)

{

Console.WriteLine(item.OrderDetailID + "\t" + item.OrderDetailItem + "\t" + item.ItemPrice);

}

  运行结果如:

  

  不过请注意,XmlSerializer 无法序列化或反序列化以下数组:

  1. ArrayList 的数组
  2. List<T> 的数组
  3. 业务需要不用序列化的属性,只需给该属性加上XmlIgnore

  特性即可,再次执行序列化操作如图,大家会发现已经少了一个子节点。

  

  序列化后的字符串可参与传输,复杂类型存储,SQL查询等业务。

  本文示例代码点击下载

  本文属于转载文章,点击这里查看原文

.NET操作XML文件之泛型集合的序列化与反序列化的更多相关文章

  1. WebAPI调用笔记 ASP.NET CORE 学习之自定义异常处理 MySQL数据库查询优化建议 .NET操作XML文件之泛型集合的序列化与反序列化 Asp.Net Core 轻松学-多线程之Task快速上手 Asp.Net Core 轻松学-多线程之Task(补充)

    WebAPI调用笔记   前言 即时通信项目中初次调用OA接口遇到了一些问题,因为本人从业后几乎一直做CS端项目,一个简单的WebAPI调用居然浪费了不少时间,特此记录. 接口描述 首先说明一下,基于 ...

  2. JAVA中通过Jaxp操作XML文件基础

    Java中有多种方式操作XML文件,目前讲一讲以SUN公司提供的DocumentBuilderFactory工厂类对象操作XML. 使用XML基本操作就是需要CRUD(增删改查),那么首先通过一个查询 ...

  3. C#基础知识---Linq操作XML文件

    概述 Linq也就是Language Integrated Query的缩写,即语言集成查询,是微软在.Net 3.5中提出的一项新技术. Linq主要包含4个组件---Linq to Objects ...

  4. Asp.Net 操作XML文件的增删改查 利用GridView

    不废话,直接上如何利用Asp.NET操作XML文件,并对其属性进行修改,刚开始的时候,是打算使用JS来控制生成XML文件的,但是最后却是无法创建文件,读取文件则没有使用了 index.aspx 文件 ...

  5. Java操作XML文件 dom4j 篇

    在项目中,我们很多都用到了xml文件,无论是参数配置还是与其它系统的数据交互.今天就来讲一下Java 中使用dom4j来操作XML文件. 我们需要引入的包: //文件包 import java.io. ...

  6. PHP操作XML文件学习笔记

    原文:PHP操作XML文件学习笔记 XML文件属于标签语言,可以通过自定义标签存储数据,其主要作用也是作为存储数据. 对于XML的操作包括遍历,生成,修改,删除等其他类似的操作.PHP对于XML的操作 ...

  7. Qt之QDomDocument操作xml文件-模拟ini文件存储

    一.背景 不得不说Qt是一个很强大的类库,不管是做项目还是做产品,Qt自身封装的东西就已经非常全面了,我们今天的这篇文章就是模拟了Qt读写ini文件的一个操作,当然是由于一些外力原因,我们决定自己来完 ...

  8. C#操作xml文件:使用XmlDocument 实现读取和写入

    XML文件是一种常用的文件格式,例如WinForm里面的app.config以及Web程序中的web.config文件,还有许多重要的场所都有它的身影.Xml是Internet环境中跨平台的,依赖于内 ...

  9. 利用XmlDocument操作XML文件

    利用XmlDocument可以方便的操作XML文件. .操作XML文件基本方法 ()添加对System.Xml的引用,并使用using语句添加引用: ()假设要读取的XML文件如下: <?xml ...

随机推荐

  1. JNI 详细使用 基础【步骤】

    1.定义本地[native]方法.通常情况下,应单独定义一个类来封装所有native方法.native方法相当于一个[接口]中的方法,只有方法声明,没有方法体. 2.在项目根目录下创建[jni文件夹] ...

  2. python3 把excel文件合并并保存到csv文件

    具体是这样,某路径下有很多 excel文件,文件名中包含相同关键字的是一类文件,把包含相同关键字的文件合并成一个文件,生成一个新的csv文件 # coding=utf-8 import xlrd im ...

  3. SqlServer 在查询结果中如何过滤掉重复数据

    问题背景 在一个多表查询的sql中正常情况下产生的数据都是唯一的,但因为数据库中存在错误(某张表中存在相同的外键ID)导致我这边查询出来的数据就会有重复的问题 下面结果集中UserID:15834存在 ...

  4. 内容匹配广告投放技术4:网盟CTR预估(百度文库课程)

    原文:http://wbj0110.iteye.com/blog/2043065 该文是百度文库课程<计算广告学之内容匹配广告&展示广告原理.技术和实践>的课程笔记,感谢百度! 课 ...

  5. COM中的HRESULT

  6. [Backbone]4. Model & View, toggle between Model and View. -- 1

    如上图所示: Server有Data都交给Models处理, 然后由Models给Views Data,让View去告诉DOM如何显示, 然后DOM显示HTML; View events update ...

  7. (LeetCode74)Search a 2D Matrix

    Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the follo ...

  8. 【linux】重置fedora root密码

    I forget root password on fedora,debian.fedora 17 fedora 18 fedora 19 fedora 20 fedora 21 fedora .de ...

  9. lenovo E431 win8系统 安装win7

    事由:新买的lenovo e431 原装win8系统.win8系统本来就不好用,又傻傻的装了win10的预览版,丑死不说,还各种驱动不兼容,每次开机都提示不兼容——本人有点洁癖,见不得这种,本想把不兼 ...

  10. 新浪面试题:只允许使用++操作符实现加减乘除运算(c语言版)

    //假定a,b都是正整数,只允许使用++而不使用-,--,*,/操作符的情况下实现加减乘除运算 //使用++实现加法: int jiafa(int a,int b){ for (int i=0;i&l ...