微軟已經意識到序列化資料的重要性,因此在.net框架中包含了命名空間system.runtime.serialization和system.xml.serialization以提供序列化功能,為使用者自己編寫序列化方法提供了乙個框架。system.xml.serialization命名空間提供了將乙個物件序列化為xml格式的基本方法。下面我們來看看如何使用這種方法。
xml的魅力
序列化xml是指為了方便儲存或傳輸,把乙個物件的公共的域和屬性儲存為一種序列格式(這裡是xml格式)的過程。非序列化則是使用序列的狀態資訊將物件從序列xml狀態還原成原始狀態的過程。因此,可以把序列化看作是將物件的狀態儲存到流或緩衝區中的一種方法。
物件中的資料可以是類、方法、屬性、私有型別、陣列,在system.xml.xmlelement或system.xml.xmlattribute物件中,它甚至可以是內嵌的xml。
system.xml.serialization命名空間中的關鍵類是xmlserializer。當然在該命名空間中還包括有關xml其他方面以及soap相關的其他類,不過我們的重點是xmlserializer類。
xmlserializer
xmlserializer類提供了把物件序列化為xml檔案及把xml文件非序列化為物件的方法。它還能讓使用者指定物件如何轉化為xml。可以把將被序列化的物件的型別作為類建構函式的引數。下面的c# **說明了建構函式的用法。
xmlserializer ser = new xmlserializer(typeof(objecttoserialize));
控制輸出
序列化過程生成標準的xml檔案,資料成員轉換為xml元素。不過,並非所有的資料成員都變成元素,可以通過在類**中新增一些標記來控制輸出的xml檔案。這樣,資料成員可以變換為xml屬性而非元素,也可以簡單的被忽略掉。下面的例子是一段經過修改後的book類vb.net**。
public class book
public authorobject as author
public title as string
_public isbn as string
_public retailprice as double
public publisher as string
end class
這段**告訴系統在生成xml檔案時把類成員isbn作為xml屬性,同時忽略掉retailprice成員。這種變化可以在生成的xml檔案中可以看出:
<?xml version="1.0" encoding="utf-8"?>
tony
patton
male
1 main street
anywhere
ky40000
usapractical lotusscript
manning publications
以下是相應的c# **:
public class book
public string title;
public author authorobject;
[system.xml.serialization.xmlattribute()]
public string isbn;
[system.xml.serialization.xmlignoreattribute()]
public double retailprice;
public string publisher;
} 上面僅是稍微提了兩種標記符號。請查閱.net文件以獲得完整的標記符號。
非序列化
非序列化資料通過呼叫xmlserializer類的deserialize方法可以方便地實現。以下的vb.net程式片斷完成上文中xml文件的非序列化:
dim bookobject as new book
dim ser as new xmlserializer(gettype(book))
dim fs as new system.io.filestream("booktest.xml", filemode.open)
dim reader as new system.xml.xmltextreader(fs)
bookobject = ctype(ser.deserialize(reader), book)
該程式把結果資料放入記憶體備用。
下面是等價的c# **:
xmlserializer ser = new xmlserializer(typeof(book));
system.io.filestreamfs = new system.io.filestream("booktest.xml",
filemode.open);
system.xml.xmltextreader reader = new system.xml.xmltextreader(fs);
book bookobject = (book)(ser.deserialize(reader));
XmlSerializer中比SGen更深遂的問題
傳說中,net的xmlserializer使用方便功能強,我們一直用它。只不過,它需要在執行時編譯出乙個或多個專門用來解析xml的dll。為了免除這部分執行時編譯開銷,便誕生了sgen,用來預先生成解析的dll。但是,這裡有幾個沒有說清楚的問題。首先,我們是不需要去手工引用並使用生成的 xmlser...
XmlSerializer 類的使用
類user using system using system.data using system.configuration using system.web using system.web.security using system.web.ui using system.web.ui.web...
XmlSerializer 生成Xml檔案
獲取工廠類 xmlpullparse ctory factory xmlpullparse ctory.newinstance 獲取xmlserializer類 xmlserializer serializer factory.newserializer 獲取檔案輸出流 outputstream o...