c#序列化與反序列化介紹

1.對象序列化的介紹

(1).NET支持對象序列化的幾種方式

二進制序列化:對象序列化之後是二進制形式的,通過BinaryFormatter類來實現的,這個類位於System.Runtime.Serialization.Formatters.Binary命名空間下。

SOAP序列化:對象序列化之後的結果符合SOAP協議,也就是可以通過SOAP 協議傳輸,通過System.Runtime.Serialization.Formatters.Soap命名空間下的SoapFormatter類來實現的。

XML序列化:對象序列化之後的結果是XML形式的,通過XmlSerializer 類來實現的,這個類位於System.Xml.Serialization命名空間下。XML序列化不能序列化私有數據。

(2)幾種序列化的區別

二進制格式和SOAP格式可序列化一個類型的所有可序列化字段,不管它是公共字段還是私有字段。XML格式僅能序列化公共字段或擁有公共屬性的私有字段,未通過屬性公開的私有字段將被忽略。

使用二進制格式序列化時,它不僅是將對象的字段數據進行持久化,也持久化每個類型的完全限定名稱和定義程序集的完整名稱(包括包稱、版本、公鑰標記、區域性),這些數據使得在進行二進制格式反序列化時亦會進行類型檢查。SOAP格式序列化通過使用XML命名空間來持久化原始程序集信息。而XML格式序列化不會保存完整的類型名稱或程序集信息。這便利XML數據表現形式更有終端開放性。如果希望儘可能延伸持久化對象圖的使用範圍時,SOAP格式和XML格式是理想選擇。

(3)使用特性對序列化的控制

要讓一個對象支持.Net序列化服務,用戶必須為每一個關聯的類加上[Serializable]特性。如果類中有些成員不適合參與序列化(比如:密碼字段),可以在這些域前加上[NonSerialized]特性。

2.使用二進制序列化和反序列化

(1)二進制序列化與反序列化的程序示例

[Serializable] //必須添加序列化特性

public class Person

{

private string Name;//姓名

private bool Sex;//性別,是否是男

public Person(string name, bool sex)

{

this.Name = name;

this.Sex = sex;

}

public override string ToString()

{

return "姓名:" + this.Name + "\t性別:" + (this.Sex ? "男" : "女");

}

}

[Serializable] //必須添加序列化特性

public class Programmer : Person

{

private string Language;//編程語言

public Programmer(string name, bool sex, string language) : base(name, sex)

{

this.Language = language;

}

public override string ToString()

{

return base.ToString() + "\t編程語言:" + this.Language;

}

}

class Program

{

static void Main(string[] args)

{

//創建Programmer列表,並添加對象

List list = new List();

list.Add(new Programmer("李志偉", true, "C#"));

list.Add(new Programmer("Coder2", false, "C++"));

list.Add(new Programmer("Coder3", true, "Java"));

//使用二進制序列化對象

string fileName = @"D:\\users\lizw\桌面\Programmers.dat";//文件名稱與路徑

Stream fStream = new FileStream(fileName, FileMode.Create, FileAccess.ReadWrite);

BinaryFormatter binFormat = new BinaryFormatter();//創建二進制序列化器

binFormat.Serialize(fStream, list);

//使用二進制反序列化對象

list.Clear();//清空列表

fStream.Position = 0;//重置流位置

list = (List)binFormat.Deserialize(fStream);//反序列化對象

foreach (Programmer p in list)

{

Console.WriteLine(p);

}

Console.Read();

}

}

(2)總結

使用二進制序列化,必須為每一個要序列化的的類和其關聯的類加上[Serializable]特性,對類中不需要序列化的成員可以使用[NonSerialized]特性。

二進制序列化對象時,能序列化類的所有成員(包括私有的),且不需要類有無參數的構造方法。

使用二進制格式序列化時,它不僅是將對象的字段數據進行持久化,也持久化每個類型的完全限定名稱和定義程序集的完整名稱(包括包稱、版本、公鑰標記、區域性),這些數據使得在進行二進制格式反序列化時亦會進行類型檢查。所以反序列化時的運行環境要與序列化時的運行環境要相同,否者可能會無法反序列化成功。


分享到:


相關文章: