標籤:xml 序列化
.Net程式執行時,對象都駐留在記憶體中;記憶體中的對象如果需要傳遞給其他系統使用;或者在關機時需要儲存下來以便下次再次啟動程式使用就需要序列化和還原序列化。
System.Xml.Serialization命名空間中有一系列的屬性類別,用來控制複雜類型序列化。例如XmlElementAttribute、XmlAttributeAttribute、XmlArrayAttribute、XmlArrayItemAttribute、XmlRootAttribute等等。
可以使用XmlElement指定屬性序列化為子節點(預設情況會序列化為子節點);或者使用XmlAttribute特性制定屬性序列化為Xml節點的屬性;還可以通過XmlIgnore特性修飾要求序列化程式不序列化屬性。
數組的Xml序列化需要使用XmlArrayAttribute和XmlArrayItemAttribute;XmlArrayAttribute指定數組元素的Xml節點名,XmlArrayItemAttribute指定數組元素的Xml節點名。
看一個小例子,有一個自訂類Cat,Cat類有三個屬性分別為Color,Saying,Speed。
類定義:
[XmlRoot("CatsInfo")]public class CatCollection{ [XmlArray("Cats"), XmlArrayItem("Cat")] public Cat[] Cats { get; set; }}[XmlRoot("Cat")]public class Cat{ // 定義Color屬性的序列化為cat節點的屬性 [XmlAttribute("color")] public string Color { get; set; } // 要求不序列化Speed屬性 [XmlIgnore] public int Speed { get; set; } // 設定Saying屬性序列化為Xml子項目 [XmlElement("saying")] public string Saying { get; set; }}
測試:
//聲明一個貓咪對象 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)); //將對象序列化輸出到控制台 FileStream stream = new FileStream("test.Xml", FileMode.OpenOrCreate); serializer.Serialize(stream, cc);
結果:
<?xml version="1.0"?><CatsInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <Cats> <Cat color="White"> <saying>White or black, so long as the cat can catch mice, it is a good cat</saying> </Cat> <Cat color="Black"> <saying>White or black, so long as the cat can catch mice, it is a good cat</saying> </Cat> </Cats></CatsInfo>
使用XmlSerializer序列化,初始化XmlSerializer對象時最好使用下面兩個建構函式否則會引起記憶體流失。
XmlSerializer(Type)
XmlSerializer.XmlSerializer(Type, String)
C# XmlSerializer 對象的Xml序列化和還原序列化