您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關(guān)XmlSerializer對(duì)象中Xml序列化和反序列化的示例分析的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過來看看吧。
.Net命名空間是System.Xml.Serialization;文中的示例代碼需要引用這個(gè)命名空間。
為什么要做序列化和反序列化?
.Net程序執(zhí)行時(shí),對(duì)象都駐留在內(nèi)存中;內(nèi)存中的對(duì)象如果需要傳遞給其他系統(tǒng)使用;或者在關(guān)機(jī)時(shí)需要保存下來以便下次再次啟動(dòng)程序使用就需要序列化和反序列化。
范圍:本文只介紹xml序列化,其實(shí)序列化可以是二進(jìn)制的序列化,也可以是其他格式的序列化。
看一段最簡(jiǎn)單的Xml序列化代碼
class Program { static void Main(string[] args) { int i = 10; //聲明Xml序列化對(duì)象實(shí)例serializer XmlSerializer serializer = new XmlSerializer(typeof(int)); //執(zhí)行序列化并將序列化結(jié)果輸出到控制臺(tái) serializer.Serialize(Console.Out, i); Console.Read(); } }
上面代碼對(duì)int i進(jìn)行了序列化,并將序列化的結(jié)果輸出到了控制臺(tái),輸出結(jié)果如下
<?xml version="1.0" encoding="gb2312"?> <int>10</int>
可以將上述序列化的xml進(jìn)行反序列化,如下代碼
static void Main(string[] args) { using (StringReader rdr = new StringReader(@"<?xml version=""1.0"" encoding=""gb2312""?> <int>10</int>")) { //聲明序列化對(duì)象實(shí)例serializer XmlSerializer serializer = new XmlSerializer(typeof(int)); //反序列化,并將反序列化結(jié)果值賦給變量i int i = (int)serializer.Deserialize(rdr); //輸出反序列化結(jié)果 Console.WriteLine("i = " + i); Console.Read(); } }
以上代碼用最簡(jiǎn)單的方式說明了xml序列化和反序列化的過程,.Net系統(tǒng)類庫為我們做了大量的工作,序列化和反序列化都非常簡(jiǎn)單。但是在現(xiàn)實(shí)中業(yè)務(wù)需求往往比較復(fù)雜,不可能只簡(jiǎn)單的序列化一個(gè)int變量,顯示中我們需要對(duì)復(fù)雜類型進(jìn)行可控制的序列化。
自定義對(duì)象的Xml序列化:
System.Xml.Serialization命名空間中有一系列的特性類,用來控制復(fù)雜類型序列化的控制。例如XmlElementAttribute、XmlAttributeAttribute、XmlArrayAttribute、XmlArrayItemAttribute、XmlRootAttribute等等。
看一個(gè)小例子,有一個(gè)自定義類Cat,Cat類有三個(gè)屬性分別為Color,Saying,Speed。
namespace UseXmlSerialization { class Program { static void Main(string[] args) { //聲明一個(gè)貓咪對(duì)象 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" }; //序列化這個(gè)對(duì)象 XmlSerializer serializer = new XmlSerializer(typeof(Cat)); //將對(duì)象序列化輸出到控制臺(tái) 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)情況會(huì)序列化為子節(jié)點(diǎn));或者使用XmlAttribute特性制定屬性序列化為Xml節(jié)點(diǎn)的屬性;還可以通過XmlIgnore特性修飾要求序列化程序不序列化修飾屬性。
對(duì)象數(shù)組的Xml序列化:
數(shù)組的Xml序列化需要使用XmlArrayAttribute和XmlArrayItemAttribute;XmlArrayAttribute指定數(shù)組元素的Xml節(jié)點(diǎn)名,XmlArrayItemAttribute指定數(shù)組元素的Xml節(jié)點(diǎn)名。
如下代碼示例:
/*玉開技術(shù)博客 http://www.php.cn/ */ 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) { //聲明一個(gè)貓咪對(duì)象 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} }; //序列化這個(gè)對(duì)象 XmlSerializer serializer = new XmlSerializer(typeof(CatCollection)); //將對(duì)象序列化輸出到控制臺(tái) 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; } } }
以上代碼將輸出:
<?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)存泄漏問題:
多謝chenlulouis,仔細(xì)看了下msdn,確實(shí)存在泄漏的情況,msdn說明如下:
動(dòng)態(tài)生成的程序集
為了提高性能,XML 序列化基礎(chǔ)結(jié)構(gòu)將動(dòng)態(tài)生成程序集,以序列化和反序列化指定類型。此基礎(chǔ)結(jié)構(gòu)將查找并重復(fù)使用這些程序集。此行為僅在使用以下構(gòu)造函數(shù)時(shí)發(fā)生:
XmlSerializer(Type)
XmlSerializer.XmlSerializer(Type, String)
如果使用任何其他構(gòu)造函數(shù),則會(huì)生成同一程序集的多個(gè)版本,且絕不會(huì)被卸載,這將導(dǎo)致內(nèi)存泄漏和性能降低。最簡(jiǎn)單的解決方案是使用先前提到的兩個(gè)構(gòu)造函數(shù)的其中一個(gè)。否則,必須在 Hashtable 中緩存程序集,如以下示例中所示。
也就是說我們?cè)谑褂肵mlSerializer序列化,初始化XmlSerializer對(duì)象時(shí)最好使用下面兩個(gè)構(gòu)造函數(shù)否則會(huì)引起內(nèi)存泄漏。
XmlSerializer(Type)
XmlSerializer.XmlSerializer(Type, String)
感謝各位的閱讀!關(guān)于“XmlSerializer對(duì)象中Xml序列化和反序列化的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。