1. 程式人生 > >C# 中XML的序列化和反序列化

C# 中XML的序列化和反序列化

這是第一篇文章,原本是在新浪微博寫的,但是新浪不支援插入程式碼,在這裡再寫一遍。但是主要目的還是記錄下來,好記性不如爛筆頭。

不做過多介紹,直接貼我的東西

生成的xml檔案

<?xml version="1.0" encoding="utf-8"?>
<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <level id="1" filePath="asd">
    <animation filePath="asddd" sceneTrigger="aaa" resultTrigger="ss" roleIdTrigger="111" />
    <reward type="role" count="9" id="00" />
  </level>
  <level id="1" filePath="asd">
    <animation filePath="asddd" sceneTrigger="aaa" resultTrigger="ss" roleIdTrigger="111" />
    <reward type="role" count="9" id="00" />
  </level>
  <level id="1" filePath="asd">
    <animation filePath="asddd" sceneTrigger="aaa" resultTrigger="ss" roleIdTrigger="111" />
    <reward type="role" count="9" id="00" />
  </level>
</root>

C#model

 [XmlType(TypeName = "root")]
    public class LevelInfoModel
    {
        [XmlElementAttribute(ElementName = "level", IsNullable = false)]
        public List<LevelInfoItemModel> levels { get; set; }
    }

    public class LevelInfoItemModel
    {
        [XmlAttribute]
        public string id { set; get; }

        [XmlAttribute]
        public string filePath { set; get; }

        [XmlElementAttribute(ElementName = "animation", IsNullable = true)]
        public List<AnimationInfoModel> aniLists { set; get; }

        [XmlElementAttribute(ElementName = "reward", IsNullable = true)]
        public List<RewardInfoModel> rewLists { set; get; }
    }

    public class AnimationInfoModel
    {
        [XmlAttribute]
        public string filePath { get; set; }

        [XmlAttribute]
        public string sceneTrigger { get; set; }

        [XmlAttribute]
        public string resultTrigger { set; get; }

        [XmlAttribute]
        public string roleIdTrigger { get; set; }
    }

    public class RewardInfoModel
    {
        [XmlAttribute]
        public string type { set; get; }

        [XmlAttribute]
        public int count { set; get; }

        [XmlAttribute]
        public string id { set; get; }

    }


XML的序列化和反序列化

 public class SerializeXmlSwitch
    {

        /// <summary>
        /// XML序列化某一型別到指定的檔案
        /// </summary>
        /// <param name="filePath"></param>
        /// <param name="obj"></param>
        /// <param name="type"></param>
        public static void SerializeToXml<T>(string filePath, T obj)
        {
            try
            {
                using (System.IO.StreamWriter writer = new System.IO.StreamWriter(filePath))
                {
                    System.Xml.Serialization.XmlSerializer xs = new System.Xml.Serialization.XmlSerializer(typeof(T));
                    xs.Serialize(writer, obj);
                }
            }
            catch (Exception ex)
            {
            }
        }
        /// <summary>
        /// 從某一XML檔案反序列化到某一型別
        /// </summary>
        /// <param name="filePath">待反序列化的XML檔名稱</param>
        /// <param name="type">反序列化出的</param>
        /// <returns></returns>
        public static T DeserializeFromXml<T>(string filePath)
        {
            try
            {
                if (!System.IO.File.Exists(filePath))
                    throw new ArgumentNullException(filePath + " not Exists");

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

下面是一些model的序列化標記
  1. 相關的常用Attribute(名稱空間System.Xml.Serialization )  
  2.     [XmlRootAttribute("PurchaseOrder", Namespace="http://www.cpandl.com"IsNullable=false)]  // 指定根  
  3.     [XmlIgnoreAttribute]                                                                      // 跳過不序列化  
  4.     [XmlArrayAttribute("Items")] public OrderedItem[] OrderedItems;                           // 層次序列化: <Items><OrderedItem.../><OrderedItem.../>..</Items>
  5.     [XmlElementAttribute(ElementName="Link"IsNullable=false)] public Link[] Links;          // 平面序列化: <Link ..../><Link .../>...  
  6.     [XmlAttribute("Cat")] public string Cat;                                                  // 表現為屬性<...Cat=.. />
  7.     [XmlElementAttribute(IsNullable=false)]                                                   // 表現為節點<Cat>..</cat>
  8. 相關的全部Attribute(名稱空間System.Xml.Serialization )  
  9.     XmlAttributes                     表示一個特性物件的集合,這些物件控制 XmlSerializer 如何序列化和反序列化物件。   
  10.     XmlArrayAttribute                 指定 XmlSerializer 應將特定的類成員序列化為 XML 元素陣列。   
  11.     XmlArrayItemAttribute             指定 XmlSerializer 可以放置在序列化陣列中的派生型別。   
  12.     XmlArrayItemAttributes            表示 XmlArrayItemAttribute 物件的集合。   
  13.     XmlAttributeAttribute             指定 XmlSerializer 應將類成員作為 XML 特性序列化。   
  14.     XmlChoiceIdentifierAttribute      指定可以通過使用列舉來進一步消除成員的歧義。   
  15.     XmlElementAttribute               在 XmlSerializer 序列化或反序列化包含物件時,指示公共欄位或屬性表示 XML 元素。   
  16.     XmlElementAttributes              表示 XmlElementAttribute 的集合,XmlSerializer 將其用於它重寫序列化類的預設方式。   
  17.     XmlEnumAttribute                  控制 XmlSerializer 如何序列化列舉成員。   
  18.     XmlIgnoreAttribute                指示 XmlSerializer 的 Serialize 方法不序列化公共欄位或公共讀/寫屬性值。   
  19.     XmlIncludeAttribute               允許 XmlSerializer 在它序列化或反序列化物件時識別型別。   
  20.     XmlRootAttribute                  控制視為 XML 根元素的屬性目標的 XML 序列化。   
  21.     XmlTextAttribute                  當序列化或反序列化包含類時,向 XmlSerializer 指示應將此成員作為 XML 文字處理。   
  22.     XmlTypeAttribute                  控制當屬性目標由 XmlSerializer 序列化時生成的 XML 架構。   
  23.     XmlAnyAttributeAttribute          指定成員(返回 XmlAttribute 物件的陣列的欄位)可以包含任何 XML 屬性。   
  24.     XmlAnyElementAttribute            指定成員(返回 XmlElement 或 XmlNode 物件的陣列的欄位)可以包含物件,該物件表示在序列化或反序列化的物件中沒有相應成員的所有 XML 元素。   
  25.     XmlAnyElementAttributes           表示 XmlAnyElementAttribute 物件的集合。   
  26.     XmlAttributeEventArgs             為 UnknownAttribute 事件提供資料。   
  27.     XmlAttributeOverrides             允許您在使用 XmlSerializer 序列化或反序列化物件時重寫屬性、欄位和類特性。   
  28.     XmlElementEventArgs               為 UnknownElement 事件提供資料。   
  29.     XmlNamespaceDeclarationsAttribute 指定目標屬性、引數、返回值或類成員包含與 XML 文件中所用名稱空間關聯的字首。   
  30.     XmlNodeEventArgs                  為 UnknownNode 事件提供資料。   
  31.     XmlSerializer                     將物件序列化到 XML 文件中和從 XML 文件中反序列化物件。XmlSerializer 使您得以控制如何將物件編碼到 XML 中。   
  32.     XmlSerializerNamespaces           包含 XmlSerializer 用於在 XML 文件例項中生成限定名的 XML 名稱空間和字首。   
  33.     XmlTypeMapping                    包含從一種型別到另一種型別的對映。