C# 中XML的序列化和反序列化
阿新 • • 發佈:2019-01-30
這是第一篇文章,原本是在新浪微博寫的,但是新浪不支援插入程式碼,在這裡再寫一遍。但是主要目的還是記錄下來,好記性不如爛筆頭。
不做過多介紹,直接貼我的東西
生成的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的序列化標記
- 相關的常用Attribute(名稱空間System.Xml.Serialization )
- [XmlRootAttribute("PurchaseOrder", Namespace="http://www.cpandl.com", IsNullable=false)] // 指定根
- [XmlIgnoreAttribute] // 跳過不序列化
- [XmlArrayAttribute("Items")] public OrderedItem[] OrderedItems; // 層次序列化: <Items><OrderedItem.../><OrderedItem.../>..</Items>
- [XmlElementAttribute(ElementName="Link", IsNullable=false)] public Link[] Links; // 平面序列化: <Link ..../><Link .../>...
- [XmlAttribute("Cat")] public string Cat; // 表現為屬性<...Cat=.. />
- [XmlElementAttribute(IsNullable=false)] // 表現為節點<Cat>..</cat>
- 相關的全部Attribute(名稱空間System.Xml.Serialization )
- XmlAttributes 表示一個特性物件的集合,這些物件控制 XmlSerializer 如何序列化和反序列化物件。
- XmlArrayAttribute 指定 XmlSerializer 應將特定的類成員序列化為 XML 元素陣列。
- XmlArrayItemAttribute 指定 XmlSerializer 可以放置在序列化陣列中的派生型別。
- XmlArrayItemAttributes 表示 XmlArrayItemAttribute 物件的集合。
- XmlAttributeAttribute 指定 XmlSerializer 應將類成員作為 XML 特性序列化。
- XmlChoiceIdentifierAttribute 指定可以通過使用列舉來進一步消除成員的歧義。
- XmlElementAttribute 在 XmlSerializer 序列化或反序列化包含物件時,指示公共欄位或屬性表示 XML 元素。
- XmlElementAttributes 表示 XmlElementAttribute 的集合,XmlSerializer 將其用於它重寫序列化類的預設方式。
- XmlEnumAttribute 控制 XmlSerializer 如何序列化列舉成員。
- XmlIgnoreAttribute 指示 XmlSerializer 的 Serialize 方法不序列化公共欄位或公共讀/寫屬性值。
- XmlIncludeAttribute 允許 XmlSerializer 在它序列化或反序列化物件時識別型別。
- XmlRootAttribute 控制視為 XML 根元素的屬性目標的 XML 序列化。
- XmlTextAttribute 當序列化或反序列化包含類時,向 XmlSerializer 指示應將此成員作為 XML 文字處理。
- XmlTypeAttribute 控制當屬性目標由 XmlSerializer 序列化時生成的 XML 架構。
- XmlAnyAttributeAttribute 指定成員(返回 XmlAttribute 物件的陣列的欄位)可以包含任何 XML 屬性。
- XmlAnyElementAttribute 指定成員(返回 XmlElement 或 XmlNode 物件的陣列的欄位)可以包含物件,該物件表示在序列化或反序列化的物件中沒有相應成員的所有 XML 元素。
- XmlAnyElementAttributes 表示 XmlAnyElementAttribute 物件的集合。
- XmlAttributeEventArgs 為 UnknownAttribute 事件提供資料。
- XmlAttributeOverrides 允許您在使用 XmlSerializer 序列化或反序列化物件時重寫屬性、欄位和類特性。
- XmlElementEventArgs 為 UnknownElement 事件提供資料。
- XmlNamespaceDeclarationsAttribute 指定目標屬性、引數、返回值或類成員包含與 XML 文件中所用名稱空間關聯的字首。
- XmlNodeEventArgs 為 UnknownNode 事件提供資料。
- XmlSerializer 將物件序列化到 XML 文件中和從 XML 文件中反序列化物件。XmlSerializer 使您得以控制如何將物件編碼到 XML 中。
- XmlSerializerNamespaces 包含 XmlSerializer 用於在 XML 文件例項中生成限定名的 XML 名稱空間和字首。
- XmlTypeMapping 包含從一種型別到另一種型別的對映。