文章出處
文章列表
1、序列化注意事項
(1).Net 序列化是基于對象的。所以只有實例字段唄序列化。靜態字段不在序列化之中。
(2)枚舉永遠是可序列化的。
2、XML序列化時去除默認命名空間xmlns:xsd和xmlns:xsi
#region 序列化 /// <summary> /// 序列化 /// </summary> /// <param name="type">類型</param> /// <param name="obj">對象</param> /// <returns></returns> public static string Serializer(Type type, object obj) { var stream = new MemoryStream(); var xml = new XmlSerializer(type); try { var xns = new XmlSerializerNamespaces(); xns.Add("", ""); //序列化對象 xml.Serialize(stream, obj, xns); } catch (InvalidOperationException) { throw; } stream.Position = 0; var sr = new StreamReader(stream); var str = sr.ReadToEnd(); sr.Dispose(); stream.Dispose(); return str; } #endregion 序列化
序列化結果示例:
<?xml version="1.0"?> <xml> <ToUserName>o4m2yt-YsHdwrpYXtir9DGwzh80E</ToUserName> <FromUserName>gh_7e832e7ed40f</FromUserName> <MsgType>text</MsgType> <CreateTime>1463319373</CreateTime> <Content>歡迎使咨詢</Content> </xml>
序列化方法可去掉<?xml version="1.0"?> xml聲明頭:
#region 序列化 /// <summary> /// 序列化 /// </summary> /// <param name="type">類型</param> /// <param name="obj">對象</param> /// <returns></returns> public static string Serializer(Type type, object obj) { var settings = new XmlWriterSettings { Indent = true, IndentChars = " ", NewLineChars = "\r\n", Encoding = Encoding.UTF8, OmitXmlDeclaration = true // 不生成聲明頭 }; var stream = new MemoryStream(); var xml = new XmlSerializer(type); try { using (XmlWriter xmlWriter = XmlWriter.Create(stream, settings)) { var xns = new XmlSerializerNamespaces(); xns.Add(string.Empty, string.Empty); //序列化對象 xml.Serialize(xmlWriter, obj, xns); xmlWriter.Close(); } } catch (InvalidOperationException) { throw; } stream.Position = 0; var sr = new StreamReader(stream); var str = sr.ReadToEnd(); sr.Dispose(); stream.Dispose(); return str; } #endregion 序列化
生成結果:
<xml> <ToUserName>o4m2yt-YsHdwrpYXtir9DGwzh80E</ToUserName> <FromUserName>gh_7e832e7ed40f</FromUserName> <MsgType>text</MsgType> <CreateTime>1463320560</CreateTime> <Content>歡迎使咨詢</Content> </xml>
知識點:
XmlWriterSettings:指定在 XmlWriter.Create 方法創建的 XmlWriter 對象上支持的一組功能。
詳情可查詢msdn:https://msdn.microsoft.com/zh-cn/library/system.xml.xmlwritersettings(v=vs.110).aspx
3、序列化常用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] // 忽略該元素的序列化。
4、相關的常用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>
5、相關的全部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 包含從一種類型到另一種類型的映射。
6、xml序列化答疑
(1)需序列化的字段必須是公共的(public) (2)需要序列化的類都必須有一個無參的構造函數 (3)枚舉變量可序列化為字符串,無需用[XmlInclude] (4)導出非基本類型對象,都必須用[XmlInclude]事先聲明。該規則遞歸作用到子元素 如導出ArrayList對象,若其成員是自定義的,需預包含處理: using System.Xml.Serialization; [XmlInclude(typeof(自定義類))] (5)Attribute中的IsNullable參數若等于false,表示若元素為null則不顯示該元素。 也就是說:針對值類型(如結構體)該功能是實效的 若數組包含了100個空間,填充了10個類對象,則序列化后只顯示10個節點 若數組包含了100個空間,填充了10個結構體對象,則序列化后會顯示100個節點 (6)真正無法XML序列化的情況 某些類就是無法XML序列化的(即使使用了[XmlInclude]) IDictionary(如HashTable) System.Drawing.Color System.Drawing.Font SecurityAttribute聲明 父類對象賦予子類對象值的情況 對象間循環引用 (7)對于無法XML序列化的對象,可考慮 使用自定義xml序列化(實現IXmlSerializable接口) 實現IDictionary的類,可考慮(1)用其它集合類替代;(2)用類封裝之,并提供Add和this函數 某些類型需要先經過轉換,然后才能序列化為 XML。如XML序列化System.Drawing.Color,可先用ToArgb()將其轉換為整數 過于復雜的對象用xml序列化不便的話,可考慮用二進制序列化
文章列表
全站熱搜