C# XML序列化方法及常用特性总结分析_C#教程

本文实例总结了C# XML序列化方法及常用特性。分享给大家供大家参考,具体如下:

C#对象XML序列化(一):序列化方法和常用特性

.Net Framework提供了对应的System.Xml.Seriazliation.XmlSerializer负责把对象序列化到XML,和从XML中反序列化为对象。Serializer的使用比较直观,需要多注意的是XML序列化相关的Attribute,怎么把这些attribute应用到我们的对象,以及对象公共属性上面去,生成满足预期格式的XML。

这里列出了最常用的方法和特性,涵盖日常大部分的转换工作,希望大家在工作中快速上手。为了给大家直观的印象,这里给出具体的使用代码,为了节省篇幅,代码异常处理没有添加,各位同学使用的时候酌情添加。

1. Serializer方法

下面的方法封装了XmlSerializer的调用,这里列出了参数最全的一个版本,具体使用的时候需适当添加重载:

public static class XmlSerializer
{
  public static void SaveToXml(string filePath, object sourceObj, Type type, string xmlRootName)
  {
    if (!string.IsNullOrWhiteSpace(filePath) && sourceObj != null)
    {
      type = type != null ? type : sourceObj.GetType();
      using (StreamWriter writer = new StreamWriter(filePath))
      {
        System.Xml.Serialization.XmlSerializer xmlSerializer = string.IsNullOrWhiteSpace(xmlRootName) ?
          new System.Xml.Serialization.XmlSerializer(type) :
          new System.Xml.Serialization.XmlSerializer(type, new XmlRootAttribute(xmlRootName));
        xmlSerializer.Serialize(writer, sourceObj);
      }
    }
  }
  public static object LoadFromXml(string filePath, Type type)
  {
    object result = null;
    if (File.Exists(filePath))
    {
      using (StreamReader reader = new StreamReader(filePath))
      {
        System.Xml.Serialization.XmlSerializer xmlSerializer = new System.Xml.Serialization.XmlSerializer(type);
        result = xmlSerializer.Deserialize(reader);
      }
    }
    return result;
  }
}

2. 序列化常用Attribute讲解说明:

[XmlRootAttribute("MyCity", Namespace="abc.abc", IsNullable=false)]   // 当该类为Xml根节点时,以此为根节点名称。
public class City
[XmlAttribute("AreaName")]  // 表现为Xml节点属性。<... AreaName="..."/>
public string Name
[XmlElementAttribute("AreaId", IsNullable = false)]  // 表现为Xml节点。<AreaId>...</AreaId>
public string Id
[XmlArrayAttribute("Areas")]  // 表现为Xml层次结构,根为Areas,其所属的每个该集合节点元素名为类名。<Areas><Area ... /><Area ... /></Areas>
public Area[] Areas
[XmlElementAttribute("Area", IsNullable = false)]  // 表现为水平结构的Xml节点。<Area ... /><Area ... />...
public Area[] Areas
[XmlIgnoreAttribute]  // 忽略该元素的序列化。

3. 详细举例说明

这里用简单的城市,区域和街区作为例子,具体示范一下上面的规则。

[XmlRootAttribute("MyCity", Namespace = "abc.abc", IsNullable = false)]
public class City
{
  [XmlAttribute("CityName")]
  public string Name
  {
    get;
    set;
  }
  [XmlAttribute("CityId")]
  public string Id
  {
    get;
    set;
  }
  [XmlArrayAttribute("Areas")]
  public Area[] Areas
  {
    get;
    set;
  }
}
[XmlRootAttribute("MyArea")]
public class Area
{
  [XmlAttribute("AreaName")]
  public string Name
  {
    get;
    set;
  }
  [XmlElementAttribute("AreaId", IsNullable = false)]
  public string Id
  {
    get;
    set;
  }
  [XmlElementAttribute("Street", IsNullable = false)]
  public string[] Streets
  {
    get;
    set;
  }
}

根据以上类型,我们mock一些数据,然后用步骤1给出的Util方法输出:

static void Main(string[] args)
{
  Area area1 = new Area();
  area1.Name = "Pudong";
  area1.Id = "PD001";
  area1.Streets = new string [] { "street 001", "street 002" };
  Area area2 = new Area();
  area2.Name = "Xuhui";
  area2.Id = "XH002";
  area2.Streets = new string [] { "street 003", "street 004" };
  City city1 = new City();
  city1.Name = "Shanghai";
  city1.Id = "SH001";
  city1.Areas = new Area[] { area1, area2 };
  XmlSerializer.SaveToXml(@"C:\temp\XML\output003.xml", city1);
}

最终输出的XML为:

<?xml version="1.0" encoding="utf-8"?>
<MyCity xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
CityName="Shanghai" CityId="SH001" xmlns="abc.abc">
 <Areas>
  <Area AreaName="Pudong">
   <AreaId>PD001</AreaId>
   <Street>street 001</Street>
   <Street>street 002</Street>
  </Area>
  <Area AreaName="Xuhui">
   <AreaId>XH002</AreaId>
   <Street>street 003</Street>
   <Street>street 004</Street>
  </Area>
 </Areas>
</MyCity>

下面我们开始具体分析结果,其中包含一些很有用的结论和注意事项

1. xml的版本,编码,以及命名空间xmlns:xsi,xmlns:xsd为Framework自动添加。
2. 因为我们用City对象作为根节点,所以根节点名称为我们定义的"MyCity"。
但是,注意!这里指的是用City自身直接做根节点,如果是City集合比如City[],此时,该名称失效,系统会自动生成名称ArrayOfCity作为根节点名称(ArrayOf+类名),或者我们手动指定名称,这个就是在给大家的SaveToXml()方法中,参数xmlRootName的作用。
3. 如果以City为根节点并在XmlRootAttribute特性中给定名称,同时也手动指定了xmlRootName,系统会以手动指定的名称为准。
4. AreaName,AreaId,同为Area类的公共属性,一个被解释成属性,一个被解释成子节点。
Areas集合被解释成了层次结构,Streets集合被解释成了水平结构。
这两组区别最能体现不同序列化Attribute的用法。

PS:小编这里再来为大家推荐几款关于xml操作的在线工具供大家免费使用。相信在以后开发中可以用的到:

在线XML格式化/压缩工具:
http://tools.jb51.net/code/xmlformat

在线XML/JSON互相转换工具:
http://tools.jb51.net/code/xmljson

xml代码在线格式化美化工具:
http://tools.jb51.net/code/xmlcodeformat

HTML/XML转义字符对照表:
http://tools.jb51.net/table/html_escape

更多关于C#相关内容感兴趣的读者可查看本站专题:《C#中XML文件操作技巧汇总》、《C#常见控件用法教程》、《WinForm控件用法总结》、《C#数据结构与算法教程》、《C#面向对象程序设计入门教程》及《C#程序设计之线程使用技巧总结》

希望本文所述对大家C#程序设计有所帮助。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索xml
, c#
, 序列化
常用特性
c站、c语言、cf、ch、c罗,以便于您获取更多的相关知识。

时间: 2024-10-07 18:51:40

C# XML序列化方法及常用特性总结分析_C#教程的相关文章

C#中实现Json序列化与反序列化的几种方式_C#教程

什么是JSON? JSON (JavaScript Object Notation) is a lightweight data-interchange format. It is easy for humans to read and write and easy for machines to parse and generate. JSON is a text format that is completely language independent. 翻译:Json[javascrip

C#计算汽车行驶方向的方法分析_C#教程

本文实例分析了C#计算汽车行驶方向的方法.分享给大家供大家参考,具体如下: 1.  场景:已知汽车行驶过程中的2个GPS坐标点A(n1,e1),B(e),计算它行驶的方向. 2. 分析:如上图所示,知道了两个点A.B,可以假设一个C点,让三个点构成一个直角三角形.现在可以知道,A,B,C三点的GPS坐标就很容易求出三个角的对边长度a,b,c.根据余弦定下CosB=(a2+c2-b2)/2ac,就可以求出CosB的值. 3.C#实现代码. /// <summary> ///计算两点GPS坐标的距

C#中常用的正则表达式实例_C#教程

目前为止,许多编程语言和工具都包含对正则表达式的支持,C#也不例外,C#基础类库中包含有一个命名空间(System.Text.RegularExpressions)和一系列可以充分发挥规则表达式威力的类(Regex.Match.Group等).那么,什么是正则表达式,怎么定义正则表达式呢? 正则表达式基础  什么是正则表达式    在编写字符串的处理程序时,经常会有查找符合某些复杂规则的字符串的需要.正则表达式就是用于描述这些规则的工具.换句话说,正则表达式就是记录文本规则的代码.     通常

c#数据的序列化和反序列化(推荐版)_C#教程

开始用的.net 自带的DataContractJsonSerializer进行序列化和反序列化,当代码写完以后,调试,我X(原谅我的脏话,因为确实让我生气),实体因为有[DataContractAttribute(IsReference=true )] 这样一个属性,提示不能序列化,当然手改一下啦,改完以后,提示基类EntityObject 的这个属性不可以 MY God!! 后来也是因为DataContractJsonSerializer 反序列化成集合的时候不好使,所以才下定决心废弃.采用

vista和win7在windows服务中交互桌面权限问题解决方法:穿透Session 0 隔离_C#教程

Windows 服务在后台执行着各种各样任务,支持着我们日常的桌面操作.有时候可能需要服务与用户进行信息或界面交互操作,这种方式在XP 时代是没有问题的,但自从Vista 开始你会发现这种方式似乎已不起作用. Session 0 隔离实验 下面来做一个名叫AlertService 的服务,它的作用就是向用户发出一个提示对话框,我们看看这个服务在Windows 7 中会发生什么情况. using System.ServiceProcess; using System.Windows.Forms;

C#常用正则大全分享_C#教程

常用的正则表达式       匹配中文字符的正则表达式: [\u4e00-\u9fa5] 评注:匹配中文还真是个头疼的事,有了这个表达式就好办了哦 获取日期正则表达式:\d{4}[年|\-|\.]\d{\1-\12}[月|\-|\.]\d{\1-\31}日? 评注:可用来匹配大多数年月日信息. 匹配双字节字符(包括汉字在内):[^\x00-\xff] 评注:可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1) 匹配空白行的正则表达式:\n\s*\r 评注:可以用来删除空白行 匹

C#启动windows服务方法的相关问题分析_C#教程

C#启动windows服务的方法都是什么呢?C#启动服务类型为Disabled的windows服务会遇到什么样的问题呢?那么本文就向你介绍C#启动windows服务的方法的相关内容. C#启动windows服务的方法是什么呢?来让我们开始吧: C#启动windows服务的由来:我们知道, 在C#代码中启动一个已经存在的windows服务,我们可以用这样的代码来完成: 复制代码 代码如下: //ACPI is an example of service name System.ServicePro

xml 中的冒号 读取问题的解决_C#教程

参考文章:http://chs.gotdotnet.com/quickstart/howto/doc/Xml/XmlNameSpace.aspx 偶的源码:         public void bindXml(string xmlUrl)         {             System.Xml.XmlDocument doc = new System.Xml.XmlDocument();             doc.Load( System.AppDomain.CurrentD

C++中sprintf使用的方法与printf的区别分析_C 语言

本文实例讲述了C++中sprintf使用的方法与printf的区别.分享给大家供大家参考.具体分析如下: 首先我们在MSDN看一下printf的原型和sprintf的原型 复制代码 代码如下: int printf( const char *format [, argument]... ); 和 复制代码 代码如下: int sprintf( char *buffer, const char *format [, argument] ... ); 从定义来看两者的功能其实很相似的. 如果你接触的