人們一直高喊XML是解決系統互聯問題的關鍵, 而.NET framework 也為處理XML數據提供了許多不同的類庫. XmlDocument 類能讓你像處理文件一樣處理XML 數據, 而XmlReader, XmlWriter, 和它們的派生類使你能夠將XML 數據做為數據流處理. XmlSerializer 則提供了另外的方法, 它使你能夠將自己的對象串行和反串行化為XML. 串行化數據既能夠讓你像處理文件一樣對數據進行隨機存取, 同時又能夠跳過你不感興趣的元素. 在本文中, 我將向你展示如何使用XmlSerializer類以及如何在你的類中添加屬性來控制串行化過程.
XmlSerializer
XmlSerializer類存在於System.Xml.Serialization命名空間的System.Xml.dll中, 它用一種高度松散耦合的方式提供串行化服務. 你的類不需要繼承特別的基類, 而且它們也不需要實現任何特別的接口. 相反的, 你只需要在你的類或者這些類的公共域以及讀/寫屬性裡加上自定義的屬性. XmlSerializer 通過相反映射讀取這些屬性並用它們將你的類和類成員映射到XML元素和屬性.
將XML 映射到對象
考慮表A中的XML語句, 哪一個正確的描述了一家電影院中上映的電影呢?
表A
<?xml version="1.0" encoding="utf-8" ?>
<theater>
<name>The Camelot</name>
<phone>(888)665-2222</phone>
<movie minutes="120" stars="2">
<title>The Score</title>
<rating>R</rating>
<showing>16:15:00</showing>
<showing>19:05:00</showing>
<showing>21:40:00</showing>
</movie>
<movie minutes="100">
<title>Shrek</title>
<rating>PG-13</rating>
<showing>16:00:00</showing>
<showing>19:00:00</showing>
<showing>21:40:00</showing>
</movie>
</theater>
表B中定義了一個Theater(電影院)類, 它包含了XmlSerializer使用的屬性映射.
表B
using System;
using System.Xml.Serialization;
namespace Articles.TechRepublic.XmlSerialization
{
[XmlRoot( "theater" )]
public class Theater
{
[XmlElement( "name" )]
public string Name = "";
[XmlElement( "phone" )]
public string Phone = "";
[XmlElement( "movie" )]
public Movie[] Movies;
public override string ToString()
{
string movies = "";
if ( Movies != null )
foreach ( Movie movie in Movies )
movies += "\n" + movie.ToString();
return String.Format( "{0}\n {1}\n{2}",
Name, Phone, movies );
}
}
XmlRoot 屬性將類Theater映射到XML的根元素theat