C# XML序列化執行個體學習

來源:互聯網
上載者:User

 

代碼

        /// <summary>
        /// 還原序列化
        /// </summary>
        /// <param name="type">物件類型</param>
        /// <param name="filename">檔案路徑</param>
        /// <returns></returns>
        public static object Load(Type type, string filename)
        {
            FileStream fs = null;
            try
            {
                // open the stream...
                fs = new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
                XmlSerializer serializer = new XmlSerializer(type);
                return serializer.Deserialize(fs);
            }
            catch(Exception ex)
            {
                throw ex;
            }
            finally
            {
                if(fs != null)
                    fs.Close();
            }
        }

        /// <summary>
        /// 序列化
        /// </summary>
        /// <param name="obj">對象</param>
        /// <param name="filename">檔案路徑</param>
        public static bool Save(object obj, string filename)
        {
            bool success = false;

            FileStream fs = null;
            // serialize it...
            try
            {
                fs = new FileStream(filename, FileMode.Create, FileAccess.Write, FileShare.ReadWrite);
                XmlSerializer serializer = new XmlSerializer(obj.GetType());
                serializer.Serialize(fs, obj);
                success = true;
            }
            catch(Exception ex)
            {
                throw ex;
            }
            finally
            {
                if(fs != null)
                    fs.Close();
            }
            return success;

        }

 

 

相關的常用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                    包含從一種類型到另一種類型的映射。

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序列化不便的話,可考慮用二進位序列化

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.