多层级XML的序列化和反序列化

CODING中经常遇到序列化多层级的XML,例如下面这种,假设名字是“Default.xml”,和Program.cs在同一文件夹下

<?xml version="1.0" encoding="utf-8" ?>
<config>
  <rules>
    <rule name="namea">
      <params>
        <item name="p" type="get" pattern="(ios|android|)" />
        <item name="cid" type="get" pattern="(ios|android|)" />
        <item name="type" type="get" pattern="(ios|android|)" />
        <item name="sort" type="get" pattern="(ios|android|)" />
        <item name="action" type="post" pattern="(ios|android|)" />
        <item name="userAgent" type="header" pattern="(ios|android|)" />
      </params>
    </rule>

    <rule name="nameb">
      <params>
        <item name="p" type="get" pattern="(ios|android|)" />
        <item name="cid" type="get" pattern="(ios|android|)" />
        <item name="type" type="get" pattern="(ios|android|)" />
        <item name="sort" type="get" pattern="(ios|android|)" />
        <item name="action" type="post" pattern="(ios|android|)" />
        <item name="userAgent" type="header" pattern="(ios|android|)" />
      </params>
    </rule>

    <rule name="namec">
      <params>
        <item name="p" type="get" pattern="(ios|android|)" />
        <item name="cid" type="get" pattern="(ios|android|)" />
        <item name="type" type="get" pattern="(ios|android|)" />
        <item name="sort" type="get" pattern="(ios|android|)" />
        <item name="action" type="post" pattern="(ios|android|)" />
        <item name="userAgent" type="header" pattern="(ios|android|)" />
      </params>
    </rule>

    <rule name="named">
      <params>
        <item name="p" type="get" pattern="(ios|android|)" />
        <item name="cid" type="get" pattern="(ios|android|)" />
        <item name="type" type="get" pattern="(ios|android|)" />
        <item name="sort" type="get" pattern="(ios|android|)" />
        <item name="action" type="post" pattern="(ios|android|)" />
        <item name="userAgent" type="header" pattern="(ios|android|)" />
      </params>
    </rule>
  </rules>
</config>

我们可以定义这样一个实体类

[XmlType(TypeName = "config")]
    public class XmlConfig
    {
        [XmlArray("rules")]
        public List<rule> rules { get; set; }
    }

    [XmlType(TypeName = "rule")]
    public class rule
    {
        [XmlAttribute]
        public string name { get; set; }

        [XmlArray("params")]
        public List<paramsItem> @params { get; set; }
    }

    [XmlType(TypeName = "item")]
    public class paramsItem
    {
        [XmlAttribute]
        public string name { get; set; }
        [XmlAttribute]
        public string type { get; set; }
        [XmlAttribute]
        public string pattern { get; set; }
    }

接下来是调用序列化和反序列化的方法

   class Program
    {
        //反序列化
        public static T DeserializeFromXml<T>(string filePath)
        {
            try
            {
                if (!File.Exists(filePath))
                    throw new ArgumentNullException(filePath + "不存在");

                using (StreamReader reader = new StreamReader(filePath))
                {
                    XmlSerializer xs = new XmlSerializer(typeof(T));
                    T ret = (T)xs.Deserialize(reader);
                    return ret;
                }
            }
            catch (Exception ex)
            {
                return default(T);
            }
        }

        //序列化
        public static void SerializeToXml<T>(string filePath, T obj)
        {
            try
            {
                using (StreamWriter writer = new StreamWriter(filePath))
                {
                    XmlSerializer xs = new XmlSerializer(typeof(T));
                    xs.Serialize(writer, obj);
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        static void Main(string[] args)
        {
            //这里的相对路径如果直接写“Default.xml”是错误的,因为当前文件实际是在bin文件夹下面
            XmlConfig xml = DeserializeFromXml<XmlConfig>(@"..\..\Default.xml");
            SerializeToXml<XmlConfig>(@"..\..\test.xml",xml);
            Console.ReadKey();
        }
    }
时间: 2024-08-08 09:34:05

多层级XML的序列化和反序列化的相关文章

C#实现复杂XML的序列化与反序列化

这篇文章主要介绍了C#实现复杂XML的序列化与反序列化的方法,是非常实用的一个技巧,需要的朋友可以参考下 本文以一个实例的形式讲述了C#实现复杂XML的序列化与反序列化的方法.分享给大家供大家参考.具体方法如下: 已知.xml(再此命名default.xml)文件,请将其反序列化到一个实例对象. Default.XML文件如下: <?xml version="1.0" encoding="utf-8" ?> <config> <rule

通过XmlSerializer 实现XML的序列化与反序列化

通过XmlSerializer 我们可以十分简单的将Model与XML进行转换 官文在点这里 帮助类 1 using System; 2 using System.Text; 3 using System.Xml.Serialization; 4 using System.IO; 5 using System.Xml; 6 7 namespace BLL 8 { 9 public class XmlHelper 10 { 11 public static T DeSerializeModels<

C#XML的序列化与反序列化

要序列化的对象的类: [Serializable]public class Person{private string name;public string Name{get{return name;}set{name=value;}}public string Sex;public int Age=31;public Course[] Courses; public Person(){}public Person(string Name){name=Name;Sex="男";} }[

C# XML对象序列化、反序列化 - PEPE YU

http://www.tuicool.com/articles/IjE7ban XML 序列化:可以将对象序列化为XML文件,或者将XML文件反序列化为对象还有种方法 使用LINQ TO XML或者反序列化的方法从XML中读取数据. 最简单的方法就是 .net framework提供的,只需要定义好xml数据格式,定义好对象即可. 1.调用方法: using RenosData.RDBao.EvidenceUploadModel.Models; using RenosData.RDBao.Evi

C#.net XML的序列化与反序列化

/// <summary> /// 将一个对象序列化为XML字符串 /// </summary> /// <param name="o">要序列化的对象</param> /// <param name="encoding">编码方式</param> /// <returns>序列化产生的XML字符串</returns> public static string Seria

XML序列化与反序列化+自定义XML注解框架XmlUtils

背景 前面一篇总结了Serializable的序列化与反序列化,现在接着总结XML.主要内容:XML基本的序列化与反序列化方法.一些注意事项.以及自定义了一个XML注解框架(简洁代码,解放双手). XML的序列化与反序列化 先与Serializable进行简单的对比: Serializable存储的文件,打开后无法正常查看,安全性高.xml文件可通过文本编辑器查看与编辑,可读性高(浏览器会格式化xml文件,更方便查看),安全性低: Serializable文件通过了签名,只能在自己的程序中反序列

C#对象序列化与反序列化

1.对象序列化的介绍 (1).NET支持对象序列化的几种方式 二进制序列化:对象序列化之后是二进制形式的,通过BinaryFormatter类来实现的,这个类位于System.Runtime.Serialization.Formatters.Binary命名空间下. SOAP序列化:对象序列化之后的结果符合SOAP协议,也就是可以通过SOAP 协议传输,通过System.Runtime.Serialization.Formatters.Soap命名空间下的SoapFormatter类来实现的.

Json的序列化与反序列化

想想某一天,你在看LOL攻略的时候,系统突然崩溃了,接着浏览器出现了密密麻麻的LOL帐号和密码,你一定在想:"天啊,这次要发财了,说不定里面有超凡号或者王者号,我得赶紧全部记下来."然而说完你就惊呆了,那么多的帐号密码,而且全部写在了Json里面,一个一个复制粘贴要记到什么时候啊...如果这时候我在你身边,我一定会帮助你的,前提是,要分几个王者号给我噢...  言归正传. 上面举的例子虽然有点不太现实,但其实是想和大家说明一个问题,如果要解析Json或XML,请不要使用检索字符串的方式

12.C#对象序列化与反序列化

1.对象序列化的介绍 (1).NET支持对象序列化的几种方式 二进制序列化:对象序列化之后是二进制形式的,通过BinaryFormatter类来实现的,这个类位于System.Runtime.Serialization.Formatters.Binary命名空间下. SOAP序列化:  对象序列化之后的结果符合SOAP协议,也就是可以通过SOAP 协议传输,通过System.Runtime.Serialization.Formatters.Soap命名空间下的SoapFormatter类来实现的