深入探討C#序列化和反序列化之前我們先要明白什麼是序列化,它又稱串行化,是.NET運行時環境用來支持用戶定義類型的流化的機制。序列化就是把一個對象保存到一個文件或數據庫字段中去,反序列化就是在適當的時候把這個文件再轉化成原來的對象使用。其目的是以某種存儲形成使自定義對象持久化,或者將這種對象從一個地方傳輸到另一個地方。.NET框架提供了兩種串行化的方式:1、是使用BinaryFormatter進行串行化;2、使用SoapFormatter進行串行化;3、使用XmlSerializer進行串行化。第一種方式提供了一個簡單的二進制數據流以及某些附加的類型信息,而第二種將數據流格式化為XML存儲;第三種其實和第二種差不多也是XML的格式存儲,只不過比第二種的XML格式要簡化很多(去掉了SOAP特有的額外信息)。可以使用[Serializable]屬性將類標志為可序列化的。如果某個類的元素不想被序列化,1、2可以使用[NonSerialized]屬性來標志,2、可以使用[XmlIgnore]來標志。
下面就讓我們開始深入了解C#序列化和反序列化:
C#序列化和反序列化1、使用BinaryFormatter進行串行化
下面是一個可串行化的類:
- using System;
- using System.Data;
- using System.Configuration;
- using System.Web;
- using System.Web.Security;
- using System.Web.UI;
- using System.Web.UI.WebControls;
- using System.Web.UI.WebControls.WebParts;
- using System.Web.UI.HtmlControls;
- using System.IO;
- using System.Runtime.Serialization.Formatters.Binary;
- /**//// ﹤summary﹥
- /// ClassToSerialize 的摘要說明
- /// ﹤/summary﹥
- [Serializable]
- public class ClassToSerialize
- {
- public int id = 100;
- public string name = "Name";
- [NonSerialized]
- public string Sex = "男";
- }
下面是串行化和反串行化的方法:
- public void SerializeNow()
- {
- ClassToSerialize c = new ClassToSerialize();
- FileStream fileStream =
- new FileStream("c:\temp.dat", FileMode.Create);
- BinaryFormatter b = new BinaryFormatter();
- b.Serialize(fileStream, c);
- fileStream.Close();
- }
- public void DeSerializeNow()
- {
- ClassToSerialize c = new ClassToSerialize();
- c.Sex = "kkkk";
- FileStream fileStream =
- new FileStream("c:\temp.dat",
- FileMode.Open, FileAccess.Read, FileShare.Read);
- BinaryFormatter b = new BinaryFormatter();
- c = b.Deserialize(fileStream) as ClassToSerialize;
- Response.Write(c.name);
- Response.Write(c.Sex);
- fileStream.Close();
- }
調用上述兩個方法就可以看到串行化的結果:Sex屬性因為被標志為[NonSerialized],故其值總是為null。
C#序列化和反序列化2、使用SoapFormatter進行串行化
和BinaryFormatter類似,我們只需要做一下簡單修改即可:
a.將using語句中的.Formatter.Binary改為.Formatter.Soap;
b.將所有的BinaryFormatter替換為SoapFormatter.
c.確保報存文件的擴展名為.xml
經過上面簡單改動,即可實現SoapFormatter的串行化,這時候產生的文件就是一個xml格式的文件。
C#序列化和反序列化3、使用XmlSerializer進行串行化
關於格式化器還有一個問題,假設我們需要XML,但是不想要SOAP特有的額外信息,那麼我們應該怎麼辦呢?有兩中方案:要麼編寫一個實現IFormatter接口的類,采用的方式類似於SoapFormatter類,但是沒有你不需要的信息;要麼使用庫類XmlSerializer,這個類不使用Serializable屬性,但是它提供了類似的功能。
如果我們不想使用主流的串行化機制,而想使用XmlSeralizer進行串行化我們需要做一下修改:
a.添加System.Xml.Seriali