1. 程式人生 > >XML序列化和反序列化

XML序列化和反序列化

對象 我們 讀取 list() 組成 pen for roo image

原文鏈接:http://www.cnblogs.com/Johnny_Z/archive/2012/06/23/2559408.html

在談XML序列化之前,我們先來說說序列化。

序列化名詞解釋:序列化是將對象狀態轉換為可保持或傳輸的格式的過程。

與序列化相對的是反序列化,它將流轉換為對象。這兩個過程結合起來,可以輕松地存儲和傳輸數據。這就是序列化的意義所在。

我們可以把對象序列化為不同的格式,比如說,Json序列化、XML序列化、二進制序列化、SOAP序列化等,以上這些不同的格式也都是為了適應具體的業務需求。

在本篇文章中,我們就來分析一下XML的序列化和反序列化。我們先來看一個XML文件:

<?xml version="1.0" encoding="utf-8" 
?> <BaseInfo> <Person> <Name>小明</Name> <Age>16</Age> <Books> <Book> <ISBN>123</ISBN> <Title>借的書1</Title> </Book> </Books> </Person> <Person> <Name>小紅</
Name> <Age>18</Age> <Books> <Book> <ISBN>456</ISBN> <Title>借的書2</Title> </Book> <Book> <ISBN>789</ISBN> <Title>借的書3</Title> </Book> </Books> </
Person> </BaseInfo>

在這個文件中BaseInfo為該XML的跟節點,它的裏面由多個Person節點組成,在Person節點中又包括Name、Age、Books節點,Books節點中又由多個Book組成,在Book中又包括ISBN和Title。
下面首先我們要做的是創建與該XML相對應的對象,然後把對象轉換為上述XML(序列化),或者把上述XML轉換為對象(反序列化)。下面的例子中只是把XML存到本地,再從本地讀取出來,如果需要在網絡中傳輸,應該添加Serializable屬性,我們先來創建對象。

using System.Xml.Serialization;
public class BaseInfo
{
List\Person\ perList = new List();
[XmlElement(ElementName="Person")]
public List\Person\ PerList
{
get { return perList; }
set { perList = value; }
}
}

使用XML序列化需要引入命名空間System.Xml.Serialization。我們創建的類名稱為BaseInfo,這裏與XML的跟節點需要對應,當然我們也可以指定該類轉換為XML時映射成的名稱,這裏可以使用XmlRoot中的ElementName來指定它的名稱,就像該類中的屬性PerList那樣應用,當然你也可以使用比較省事的方法,類的名稱和XML節點的名稱相同即可,就像該例子中一樣。在BaseInfo類中,我們維護了一個PerList它是一個Person對象的集合,當然這個屬性的名稱並不與XML文件中的對應,所以要更改它的名稱為Person。
好,接下來我們看看Person類:

using System.Xml.Serialization;
public class Person
{
string name;
int age;
List/Books/ bookList=new List/Books/();

/// /summary/
/// 必須有默認的構造函數
/// //summary/
public Person()
{ }

public Person(string name, int age)
{
this.name = name;
this.age = age;
}

public string Name
{
get { return name; }
set { name = value; }
}

public int Age
{
get { return age; }
set { age = value; }
}

[XmlElement(ElementName = "Books")]
public List/Books/ BookList
{
get { return bookList; }
set { bookList = value; }
}
}

在該類中有Name和Age,還有維護了一個Books對象。
我們再來看看Books:

using System.Xml.Serialization;
public class Books
{
List/Book/ bookList = new List/Book/();

[XmlElement(ElementName = "Book")]
public List/Book/ BookList
{
get { return bookList; }
set { bookList = value; }
}
}

Books的作用就像是一個過渡的類,只為了與XML中的節點Books對應,在該類中維護了Book類的對象集合。
那麽,最後我們來看Book類:

using System.Xml.Serialization;
public class Book
{
string isbn;
string title;

public Book() { }

public Book(string isbn, string title)
{
this.isbn = isbn;
this.title = title;
}

public string ISBN
{
get { return isbn; }
set { isbn = value; }
}

public string Title
{
get { return title; }
set { title = value; }
}
}

好了,這樣我們需要的類也就都創建完了,雖說創建類的過程有些繁雜,但是有了這些類,我們也就不用一個一個處理XML的節點了。我們創建一個簡單的控制臺程序,在裏面添加兩個處理方法,第一個是序列化方法:

public static void xmlSerialize()
{
Book b1 = new Book("111","書1");
Book b2 = new Book("222","書2");
Book b3 = new Book("333","書3");
Books bs1 = new Books();
Books bs2 = new Books();
bs1.BookList.Add(b1);
bs1.BookList.Add(b2);
bs2.BookList.Add(b3);
Person p1 = new Person("張三", 11);
Person p2 = new Person("李四", 22);
p1.BookList.Add(bs1);
p2.BookList.Add(bs2);
BaseInfo baseInfo = new BaseInfo();
baseInfo.PerList.Add(p1);
baseInfo.PerList.Add(p2);

StringWriter sw = new StringWriter();
//創建XML命名空間
XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
ns.Add("","");
XmlSerializer serializer = new XmlSerializer(typeof(BaseInfo));
serializer.Serialize(sw, baseInfo, ns);
sw.Close();

Console.Write(sw.ToString());
}

調用該方法運行效果:技術分享圖片

第二個是反序列化方法:

public static void xmlDeserialize()
{
//xml來源可能是外部文件,也可能是從其他系統獲得
FileStream file = new FileStream(@"http://www.cnblogs.com/info.xml", FileMode.Open, FileAccess.Read);
XmlSerializer xmlSearializer = new XmlSerializer(typeof(BaseInfo));
BaseInfo info = (BaseInfo)xmlSearializer.Deserialize(file);
file.Close();
foreach (Person per in info.PerList)
{
Console.WriteLine("人員:");
Console.WriteLine(" 姓名:" + per.Name);
Console.WriteLine(" 年齡:" + per.Age);
foreach (Books b1 in per.BookList)
{
foreach (Book b in b1.BookList)
{
Console.WriteLine(" 書:");
Console.WriteLine(" ISBN:" + b.ISBN);
Console.WriteLine(" 書名:" + b.Title);
}
}
}
}

調用該方法運行效果:技術分享圖片

XML序列化和反序列化