序列化又稱串行化,是.NET運行時環境用來支持用戶定義類型的流化的機制。其目的是以某種存儲造成使自定義對象持久化,或者將這種對象從一個地方傳輸到另外一個地方。
.NET框架提供了兩種串行化的方式:一、是使用BinaryFormatter進行串行化;二、使用SoapFormatter進行串行化;三、使用XmlSerializer進行串行化。第一種方式提供了一個簡單的二進制數據流以及某些附加的類型信息,而第二種將數據流格式化爲XML存儲;第三種其實和第二種差很少也是XML的格式存儲,只不過比第二種的XML格式要簡化不少(去掉了SOAP特有的額外信息)。
可使用[Serializable]屬性將類標誌爲可序列化的。若是某個類的元素不想被序列化,一、2可使用[NonSerialized]屬性來標誌,二、可使用[XmlIgnore]來標誌。
一、使用BinaryFormatter進行串行化
下面是一個可串行化的類:
框架
下面是串行化和反串行化的方法:
函數
調用上述兩個方法就能夠看到串行化的結果:Sex屬性由於被標誌爲[NonSerialized],故其值老是爲null。
二、使用SoapFormatter進行串行化
和BinaryFormatter相似,咱們只須要作一下簡單修改便可:
a.將using語句中的.Formatter.Binary改成.Formatter.Soap;
b.將全部的BinaryFormatter替換爲SoapFormatter.
c.確保報存文件的擴展名爲.xml
通過上面簡單改動,便可實現SoapFormatter的串行化,這時候產生的文件就是一個xml格式的文件。
三、使用XmlSerializer進行串行化
關於格式化器還有一個問題,假設咱們須要XML,可是不想要SOAP特有的額外信息,那麼咱們應該怎麼辦呢?有兩中方案:要麼編寫一個實現IFormatter接口的類,採用的方式相似於SoapFormatter類,可是沒有你不須要的信息;要麼使用庫類XmlSerializer,這個類不使用Serializable屬性,可是它提供了相似的功能。
若是咱們不想使用主流的串行化機制,而想使用XmlSeralizer進行串行化咱們須要作一下修改:
a.添加System.Xml.Serialization命名空間。
b.Serializable和NoSerialized屬性將被忽略,而是使用XmlIgnore屬性,它的行爲與NoSerialized相似。
c.XmlSeralizer要求類有個默認的構造器,這個條件可能已經知足了。
下面看示例:
要序列化的類:
工具
序列化和反序列化方法:學習
這裏Course類的Description屬性值將始終爲null,生成的xml文檔中也沒有該節點,以下圖:spa
四、自定義序列化
若是你但願讓用戶對類進行串行化,可是對數據流的組織方式不徹底滿意,那麼能夠經過在自定義類中實現接口來自定義串行化行爲。這個接口只有一個方法,GetObjectData. 這個方法用於將對類對象進行串行化所須要的數據填進SerializationInfo對象。你使用的格式化器將構造SerializationInfo對象,而後在串行化時調用GetObjectData. 若是類的父類也實現了ISerializable,那麼應該調用GetObjectData的父類實現。
若是你實現了ISerializable,那麼還必須提供一個具備特定原型的構造器,這個構造器的參數列表必須與GetObjectData相同。這個構造器應該被聲明爲私有的或受保護的,以防止粗心的開發人員直接使用它。
示例以下:
實現ISerializable的類:
orm
序列化和反序列化方法:xml
PS:本文章屬我的學習總結,部份內容參考互聯網上的相關文章。 其中若是發現我的總結有不正確的認知或遺漏的地方請評論告知,歡迎交流。對象