這篇文章主要介紹了XmlSerializer對象如何實現(xiàn)Xml序列化與反序列化,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
我們一直強(qiáng)調(diào)成都做網(wǎng)站、成都網(wǎng)站建設(shè)對于企業(yè)的重要性,如果您也覺得重要,那么就需要我們慎重對待,選擇一個安全靠譜的網(wǎng)站建設(shè)公司,企業(yè)網(wǎng)站我們建議是要么不做,要么就做好,讓網(wǎng)站能真正成為企業(yè)發(fā)展過程中的有力推手。專業(yè)的建站公司不一定是大公司,創(chuàng)新互聯(lián)作為專業(yè)的網(wǎng)絡(luò)公司選擇我們就是放心。
為什么要做序列化和反序列化?
.Net程序執(zhí)行時,對象都駐留在內(nèi)存中;內(nèi)存中的對象如果需要傳遞給其他系統(tǒng)使用;或者在關(guān)機(jī)時需要保存下來以便下次再次啟動程序使用就需要序列化和反序列化。
范圍:本文只介紹xml序列化,其實序列化可以是二進(jìn)制的序列化,也可以是其他格式的序列化。
看一段最簡單的Xml序列化代碼
復(fù)制代碼 代碼如下:
class Program
{
static void Main(string[] args)
{
int i = 10;
//聲明Xml序列化對象實例serializer
XmlSerializer serializer = new XmlSerializer(typeof(int));
//執(zhí)行序列化并將序列化結(jié)果輸出到控制臺
serializer.Serialize(Console.Out, i);
Console.Read();
}
}
上面代碼對int i進(jìn)行了序列化,并將序列化的結(jié)果輸出到了控制臺,輸出結(jié)果如下
復(fù)制代碼 代碼如下:
可以將上述序列化的xml進(jìn)行反序列化,如下代碼
復(fù)制代碼 代碼如下:
static void Main(string[] args)
{
using (StringReader rdr = new StringReader(@"
{
//聲明序列化對象實例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)實中業(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é)點的屬性
[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é)點(默認(rèn)情況會序列化為子節(jié)點);或者使用XmlAttribute特性制定屬性序列化為Xml節(jié)點的屬性;還可以通過XmlIgnore特性修飾要求序列化程序不序列化修飾屬性。
對象數(shù)組的Xml序列化:
數(shù)組的Xml序列化需要使用XmlArrayAttribute和XmlArrayItemAttribute;XmlArrayAttribute指定數(shù)組元素的Xml節(jié)點名,XmlArrayItemAttribute指定數(shù)組元素的Xml節(jié)點名。
如下代碼示例:
復(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é)點的屬性
[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ù)制代碼 代碼如下:
cat
cat
XmlSerializer內(nèi)存泄漏問題:
仔細(xì)看了下msdn,確實存在泄漏的情況,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)
感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“XmlSerializer對象如何實現(xiàn)Xml序列化與反序列化”這篇文章對大家有幫助,同時也希望大家多多支持創(chuàng)新互聯(lián)網(wǎng)站建設(shè)公司,,關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,更多相關(guān)知識等著你來學(xué)習(xí)!