佳木斯湛栽影视文化发展公司

主頁 > 知識庫 > 深入分析XmlSerializer對象的Xml序列化與反序列化的示例詳解

深入分析XmlSerializer對象的Xml序列化與反序列化的示例詳解

熱門標(biāo)簽:團(tuán)購網(wǎng)站 電子圍欄 阿里云 服務(wù)器配置 銀行業(yè)務(wù) 科大訊飛語音識別系統(tǒng) Linux服務(wù)器 Mysql連接數(shù)設(shè)置
這篇隨筆對應(yīng)的.Net命名空間是System.Xml.Serialization;文中的示例代碼需要引用這個命名空間。
為什么要做序列化和反序列化?
.Net程序執(zhí)行時,對象都駐留在內(nèi)存中;內(nèi)存中的對象如果需要傳遞給其他系統(tǒng)使用;或者在關(guān)機(jī)時需要保存下來以便下次再次啟動程序使用就需要序列化和反序列化。
范圍:本文只介紹xml序列化,其實(shí)序列化可以是二進(jìn)制的序列化,也可以是其他格式的序列化。
看一段最簡單的Xml序列化代碼
復(fù)制代碼 代碼如下:

class Program
{
    static void Main(string[] args)
    {
        int i = 10;
        //聲明Xml序列化對象實(shí)例serializer
        XmlSerializer serializer = new XmlSerializer(typeof(int));
        //執(zhí)行序列化并將序列化結(jié)果輸出到控制臺
        serializer.Serialize(Console.Out, i);
        Console.Read();
    }
}

上面代碼對int i進(jìn)行了序列化,并將序列化的結(jié)果輸出到了控制臺,輸出結(jié)果如下
復(fù)制代碼 代碼如下:

?xml version="1.0" encoding="gb2312"?>
int>10/int>

可以將上述序列化的xml進(jìn)行反序列化,如下代碼
復(fù)制代碼 代碼如下:

static void Main(string[] args)
{
    using (StringReader rdr = new StringReader(@"?xml version=""1.0"" encoding=""gb2312""?>
int>10/int>"))
    {
        //聲明序列化對象實(shí)例serializer
        XmlSerializer serializer = new XmlSerializer(typeof(int));
        //反序列化,并將反序列化結(jié)果值賦給變量i
        int i = (int)serializer.Deserialize(rdr);
        //輸出反序列化結(jié)果
        Console.WriteLine("i = " + i);
        Console.Read();
    }
}

以上代碼用最簡單的方式說明了xml序列化和反序列化的過程,.Net系統(tǒng)類庫為我們做了大量的工作,序列化和反序列化都非常簡單。但是在現(xiàn)實(shí)中業(yè)務(wù)需求往往比較復(fù)雜,不可能只簡單的序列化一個int變量,顯示中我們需要對復(fù)雜類型進(jìn)行可控制的序列化。
自定義對象的Xml序列化:
System.Xml.Serialization命名空間中有一系列的特性類,用來控制復(fù)雜類型序列化的控制。例如XmlElementAttribute、XmlAttributeAttribute、XmlArrayAttribute、XmlArrayItemAttribute、XmlRootAttribute等等。
看一個小例子,有一個自定義類Cat,Cat類有三個屬性分別為Color,Saying,Speed。
復(fù)制代碼 代碼如下:

namespace UseXmlSerialization
{
    class Program
    {
        static void Main(string[] args)
        {
            //聲明一個貓咪對象
            var c = new Cat { Color = "White", Speed = 10, Saying = "White or black,  so long as the cat can catch mice,  it is a good cat" };

            //序列化這個對象
            XmlSerializer serializer = new XmlSerializer(typeof(Cat));

            //將對象序列化輸出到控制臺
            serializer.Serialize(Console.Out, c);

            Console.Read();
        }
    }
    [XmlRoot("cat")]
    public class Cat
    {
        //定義Color屬性的序列化為cat節(jié)點(diǎn)的屬性
        [XmlAttribute("color")]
        public string Color { get; set; }

        //要求不序列化Speed屬性
        [XmlIgnore]
        public int Speed { get; set; }

        //設(shè)置Saying屬性序列化為Xml子元素
        [XmlElement("saying")]
        public string Saying { get; set; }
    }
}

可以使用XmlElement指定屬性序列化為子節(jié)點(diǎn)(默認(rèn)情況會序列化為子節(jié)點(diǎn));或者使用XmlAttribute特性制定屬性序列化為Xml節(jié)點(diǎn)的屬性;還可以通過XmlIgnore特性修飾要求序列化程序不序列化修飾屬性。
對象數(shù)組的Xml序列化:
數(shù)組的Xml序列化需要使用XmlArrayAttribute和XmlArrayItemAttribute;XmlArrayAttribute指定數(shù)組元素的Xml節(jié)點(diǎn)名,XmlArrayItemAttribute指定數(shù)組元素的Xml節(jié)點(diǎn)名。
如下代碼示例:
復(fù)制代碼 代碼如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Serialization;

namespace UseXmlSerialization
{
    class Program
    {
        static void Main(string[] args)
        {
            //聲明一個貓咪對象
            var cWhite = new Cat { Color = "White", Speed = 10, Saying = "White or black,  so long as the cat can catch mice,  it is a good cat" };
            var cBlack = new Cat { Color = "Black", Speed = 10, Saying = "White or black,  so long as the cat can catch mice,  it is a good cat" };

            CatCollection cc = new CatCollection { Cats = new Cat[] { cWhite,cBlack} };

            //序列化這個對象
            XmlSerializer serializer = new XmlSerializer(typeof(CatCollection));

            //將對象序列化輸出到控制臺
            serializer.Serialize(Console.Out, cc);

            Console.Read();
        }
    }
    [XmlRoot("cats")]
    public class CatCollection
    {
        [XmlArray("items"),XmlArrayItem("item")]
        public Cat[] Cats { get; set; }
    }

    [XmlRoot("cat")]
    public class Cat
    {
        //定義Color屬性的序列化為cat節(jié)點(diǎn)的屬性
        [XmlAttribute("color")]
        public string Color { get; set; }

        //要求不序列化Speed屬性
        [XmlIgnore]
        public int Speed { get; set; }

        //設(shè)置Saying屬性序列化為Xml子元素
        [XmlElement("saying")]
        public string Saying { get; set; }
    }
}

以上代碼將輸出:
復(fù)制代碼 代碼如下:

?xml version="1.0" encoding="gb2312"?>
cats xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://ww
w.w3.org/2001/XMLSchema">
  items>
    item color="White">
      saying>White or black,  so long as the cat can catch mice,  it is a good
cat/saying>
    /item>
    item color="Black">
      saying>White or black,  so long as the cat can catch mice,  it is a good
cat/saying>
    /item>
  /items>
/cats>

XmlSerializer內(nèi)存泄漏問題:
仔細(xì)看了下msdn,確實(shí)存在泄漏的情況,msdn說明如下:
動態(tài)生成的程序集
為了提高性能,XML 序列化基礎(chǔ)結(jié)構(gòu)將動態(tài)生成程序集,以序列化和反序列化指定類型。此基礎(chǔ)結(jié)構(gòu)將查找并重復(fù)使用這些程序集。此行為僅在使用以下構(gòu)造函數(shù)時發(fā)生:
XmlSerializer(Type)
XmlSerializer.XmlSerializer(Type, String)
如果使用任何其他構(gòu)造函數(shù),則會生成同一程序集的多個版本,且絕不會被卸載,這將導(dǎo)致內(nèi)存泄漏和性能降低。最簡單的解決方案是使用先前提到的兩個構(gòu)造函數(shù)的其中一個。否則,必須在 Hashtable 中緩存程序集,如以下示例中所示。
也就是說我們在使用XmlSerializer序列化,初始化XmlSerializer對象時最好使用下面兩個構(gòu)造函數(shù)否則會引起內(nèi)存泄漏。
XmlSerializer(Type)
XmlSerializer.XmlSerializer(Type, String)

標(biāo)簽:大理 衡水 衢州 蚌埠 棗莊 廣元 江蘇 萍鄉(xiāng)

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《深入分析XmlSerializer對象的Xml序列化與反序列化的示例詳解》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266
    安陆市| 宁阳县| 庆安县| 常山县| 綦江县| 玉环县| 吐鲁番市| 锦屏县| 永昌县| 岗巴县| 山东省| 甘肃省| 耒阳市| 新疆| 龙泉市| 通江县| 桦南县| 贺州市| 湾仔区| 兴安盟| 长沙市| 洪洞县| 新田县| 汉源县| 陆丰市| 英超| 吉木萨尔县| 收藏| 礼泉县| 临澧县| 广饶县| 嫩江县| 读书| 剑河县| 江源县| 天祝| 随州市| 威宁| 克东县| 湘乡市| 理塘县|