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.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
foreach (Programmer p in list)
{
Console.WriteLine(p);
}
Console.Read();
}
}
(2)總結
使用二進制序列化,必須為每一個要序列化的的類和其關聯的類加上[Serializable]特性,對類中不需要序列化的成員可以使用[NonSerialized]特性。
二進制序列化對象時,能序列化類的所有成員(包括私有的),且不需要類有無參數的構造方法。
使用二進制格式序列化時,它不僅是將對象的字段數據進行持久化,也持久化每個類型的完全限定名稱和定義程序集的完整名稱(包括包稱、版本、公鑰標記、區域性),這些數據使得在進行二進制格式反序列化時亦會進行類型檢查。所以反序列化時的運行環境要與序列化時的運行環境要相同,否者可能會無法反序列化成功。
閱讀更多 老孔說編程 的文章