.net中對象序列化技術淺談

轉載:
 
 
 
序列化是將對象狀態轉換爲可保持或傳輸的格式的過程。與序列化相對的是反序列化,它將流轉換爲對象。這兩個過程結合起來,能夠輕鬆地存儲和傳輸數據。例如,能夠序列化一個對象,而後使用 HTTP 經過 Internet 在客戶端和服務器之間傳輸該對象。反之,反序列化根據流從新構造對象。此外還能夠將對象序列化後保存到本地,再次運行的時候能夠從本地文件中「恢復」對象到序列化以前的狀態。
在.net中有提供了幾種序列化的方式:
二進制序列化
XML序列化
SOAP序列化
 
二進制序列化
所謂二進制序列化,指的是對象序列化以後是二進制形式的。二進制序列化是經過BinaryFormatter類來實現的,這個類位於System.Runtime.Serialization.Formatters.Binary命名空間下。
XML序列化
所謂XML序列化,是指對象序列化以後的結果是XML形式的。保存XML序列化是經過XmlSerializer 類來實現的, 這個類位於System.Xml.Serialization命名空間下。
SOAP序列化
所謂SOAP序列化是指對象序列化以後的結果符合SOAP協議,也就是能夠經過SOAP 協議傳輸(不知道SOAP協議?百度一下吧)。SOAP序列化是經過SoapFormatter類來實現的,這個類位於 System.Runtime.Serialization.Formatters.Soap命名空間下,而且須要注意須要手動添加對這個命名空間的引用,以下圖所示:
 
下面編寫一個類用於序列化和反序列化,這個類的代碼以下:

下面是分別用上面的三個類進行序列化和反序列化的代碼:

這個程序的運行效果以下:
 
可見經過上面三個類都能實現將對象序列化保存,而且都能反序列化還原到對象被序列化以前的狀態(這正是序列化意義所在,能保存對象運行時的狀態而且還能還原)。若是運行上面的代碼會在C盤根目錄下建立三個文件,分別是MyObject.dat、MyObject.soap和MyObject.xml文件,由於MyObject.dat是二進制文件,因此沒法查看文件的內容,可是咱們能夠打開MyObject.soap和MyObject.xml這兩個文件來比較一下有什麼區別。
MyObject.soap文件的後綴雖然是.soap,可是仍是能夠用記事本打開的,下面是MyObject.soap文件的內容:

MyObject.xml文件也能夠用記事本打開,它的內容以下:

熟悉SOAP協議的朋友一看MyObject.soap文件的內容就知道它符合SOAP協議,MyObject.xml文件毫無疑問是一個符合XML規範的文件。
對代碼做幾點說明:
一、若是採用BinaryFormatter類或者SoapFormatter類來實現序列化,則必定要給類加上Serializable屬性,如代碼中所示:

若是不給要序列化的對象加上這個屬性,那麼採用採用BinaryFormatter類或者SoapFormatter類來實現序列化時會報異常,但使用XmlSerializer 類序列化對象時能夠不用這個屬性。
二、另外,若是不想序列化某個字段,能夠給其加上NonSerialized屬性,這樣在序列化時就不會保存這個這個字段的值了,好比不想序列化name這個字段,能夠以下寫代碼:

再次運行剛纔的程序會獲得以下效果:
  看有黃色底線部分,由於name字段不被序列化,因此經過二進制序列化和SOAP序列化以後再反序化就得不到原來的值了。 三、最後還須要說明一點的是,SoapFormatter類在.net3.5開始已通過時了,微軟建議使用BinaryFormatter類來序列化和反序列化了。 
相關文章
相關標籤/搜索