序列化
序列化 (Serialization)是將對象的狀態信息轉換爲可以存儲或傳輸的形式的過程,序列把對象轉換成有序字節流,以便在網絡上傳輸或者保存在本地文件中
序列化的主要目的有三個:
1)以某種存儲形式使自定義對象持久化;
2)將對象從一個地方傳遞到另一個地方;
3)使程序更具維護。
對於需要序列化的對象,需要在類前面聲明[Serializable],表示其可序列化,其語法格式如下所示:
[Serializable]//表示類可以序列化
public class Person
{
string _name;
public string Name { get => _name; set => _name = value; }
public string Gender { get => _gender; set => _gender = value; }
string _gender;
}
反序列化
反序列化指把字節序列恢復爲對象的過程,即將二進制轉化爲對象,客戶端從文件中或網絡上獲得序列化後的對象字節流後,根據字節流中所保存的對象狀態及描述信息,通過反序列化重建對象
序列化和反序列化的過程如下所示:
static void Main(string[] args)
{
//要將p1這個對象,傳輸給對方電腦
Person p1 = new Person();
p1.Name = "張三";
p1.Gender = "男";
using (FileStream fsWrite = new FileStream(@"C:\Users\91134\Desktop\new.txt", FileMode.OpenOrCreate, FileAccess.Write))
{
//開始序列化對象
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(fsWrite, p1);
}
Console.WriteLine("序列化成功");
//接受對方發送過來的二進制 反序列化成對象
Person p;
using (FileStream fsRead = new FileStream(@"C:\Users\91134\Desktop\new.txt", FileMode.OpenOrCreate, FileAccess.Read))
{
BinaryFormatter bf1 = new BinaryFormatter();
p=(Person) bf1.Deserialize(fsRead);
}
Console.WriteLine("反序列化成功");
Console.WriteLine(p.Name);
Console.WriteLine(p.Gender);
Console.ReadKey();
}
序列化與反序列化重要是利用Serialize、Deserialize兩個方法,而在.net framework的類庫中提供了三個可以用於序列化和反序列化的類,分別爲BinaryFormatter、SoapFormatter和XmlSerializer,這三種類對象都可調用序列化和反序列的方法進行操作。
BinaryFormatter可以對單個對象,或集合對象(如List、ObservableCollection)進行序列化。
需要指出的是,需要對被序列化的對象添加[Serializable]特性,也就是我們上述提到的格式
XmlSerializer,無論對於單個對象還是集合對象(如List、ObservableCollection),都可以使用XmlSerializer進行序列化。需要指出的是,不需要對被序列化的對象添加[Serializable]特性註解。但是,使用XmlSeriabizable的時候,被序列化的對象應該具有無參數構造函數
而SoapFormatter現在基本被淘汰,不被使用了,用法與BinaryFormatter類似
總結
序列化步驟:
1.得到一個存儲對象的類型
2.創建一個寫入文件流
3.定義要序列化的類型
4.調用序列化方法
反序列化步驟:
1.定義一個裝載對象的類型
2.創建一個讀出文件流
3.定義要反序列化的類型
4.調用反序列化方法
二進制序列化的優點:
1. 所有的類成員(包括只讀的)都可以被序列化;
2. 性能非常好。
XML序列化的優點:
1. 互操作性好;
2. 不需要嚴格的二進制依賴;
3. 可讀性強
參考鏈接
1、c# 序列化BinaryFormatter、SoapFormatter和XmlSerializer的區別
2、序列化和反序列化
--------------------------------------以上內容由作者原創,歡迎轉載,部分從網絡整理,如侵權清聯繫刪除----------------------------------------------