序列化又稱串行化,是.NET運行時環境用來支持用戶定義類型的流化的機制。其目的是以某種存儲形成使自定義對象持久化,或者將這種對象從一個地方傳輸到另一個地方。
.NET框架提供了兩種種串行化的方式:1、是使用BinaryFormatter進行串行化;2、使用XmlSerializer進行串行化。第一種方式提供了一個簡單的二進制數據流以及某些附加的類型信息,而第二種將數據流格式化為XML存儲。 可以使用[Serializable]屬性將類標志為可序列化的。如果某個類的元素不想被序列化,1、可以使用[NonSerialized]屬性來標志,2、可以使用[XmlIgnore]來標志。
1.BinaryFormatter
命名空間:System.Runtime.Serialization.Formatters.Binary;
下面先定義一個可序列化類:
[Serializable] //表示該類可被序列化
class Peoson {
public Peoson() { }
public Peoson(string name, int age)
{
this.name = name;
this.age = age;
}
private string name;
public string Name
{
get { return name; }
set { name = value; }
}
[NonSerialized] //表示下面這個age字段不進行序列化
private int age;
public int Age
{
get { return age; }
set { age = value; }
}
public void SayHi()
{
Console.WriteLine("大家好,我是{0},今年{1}歲",name,age);
}
}
Main函數中:
List<Peoson> listPers = new List<Peoson>(); Peoson per1 = new Peoson("張三", 18); Peoson per2 = new Peoson("李四", 20); listPers.Add(per1); listPers.Add(per2); SerializeMethod(listPers); //ReserializeMethod(); //反序列化成把上面一行注釋掉 執行此行 Console.ReadKey();
序列化和反序列化的方法:
static void ReserializeMethod() { //反序列化 using (FileStream fs = new FileStream("1.bin", FileMode.Open)) { BinaryFormatter bf = new BinaryFormatter(); List<Peoson> list = bf.Deserialize(fs) as List<Peoson>; if (list != null) { for (int i = 0; i < list.Count; i++) { list[i].SayHi(); } } } } static void SerializeMethod(List<Peoson> listPers) { //序列化 using (FileStream fs = new FileStream("1.bin", FileMode.Create)) { BinaryFormatter bf = new BinaryFormatter(); bf.Serialize(fs, listPers); } } }
反序列化輸出結果:
大家好,我是張三,今年0歲
大家好,我是李四,今年0歲
由此看出,未序列化的字段存儲的值為空。
2、使用XmlSerializer進行串行化
關於格式化器還有一個問題,假設我們需要 XML,有兩中方案:要么編寫一個實現IFormatter接口的類,采用的方式類似於SoapFormatter類,但是沒有你不需要的信息;要么使用 庫類XmlSerializer,這個類不使用Serializable屬性,但是它提供了類似的功能。
如果我們不想使用主流的串行化機制,而想使用XmlSeralizer進行串行化我們需要做一下修改:
a.添加System.Xml.Serialization命名空間。
b.Serializable和NoSerialized屬性將被忽略,而是使用XmlIgnore屬性,它的行為與NoSerialized類似。
c.XmlSeralizer要求類有個默認的構造器,這個條件可能已經滿足了。
序列化:
XmlSerializer xs = new XmlSerializer(typeof(List<Peoson>));
xs.Serialize(fs, listPers);
反序列化:
XmlSerializer xs = new XmlSerializer(typeof(List<Peoson>));
List<Peoson> list = xs.Deserialize(fs) as List<Peoson>;
