什么是序列化與反序列化???
序列化和反序列化,我們可能經常會聽到,其實通俗一點的解釋,序列化就是把一個對象保存到一個文件或數據庫字段中去,反序列化就是在適當的時候把這個文件再轉化成原來的對象使用。
當兩個進程在進行遠程通信時,彼此可以發送各種類型的數據。無論是何種類型的數據,都會以二進制序列的形式在網絡上傳送。發送方需要把這個對象轉換為字節序列,才能在網絡上傳送;接收方則需要把字節序列再恢復為對象。
把對象轉換為字節序列的過程稱為對象的序列化。
把字節序列恢復為對象的過程稱為對象的反序列化。
對象的序列化主要有兩種用途:
1) 把對象的字節序列永久地保存到硬盤上,通常存放在一個文件中;
我們經常需要將對象的字段值保存到磁盤中,並在以后檢索此數據。盡管不使用序列化也能完成這項工作,但這種方法通常很繁瑣而且容易出錯,並且在需要跟蹤對象的層次結構時,會變得越來越復雜。可以想象一下編寫包含大量對象的大型業務應用程序的情形,程序員不得不為每一個對象編寫代碼,以便將字段和屬性保存至磁盤以及從磁 盤還原這些字段和屬性。序列化提供了輕松實現這個目標的快捷方法。公共語言運行時 (CLR) 管理對象在內存中的分布,.NET 框架則通過使用反射提供自動的序列化機制。對象序列化后,類的名稱、程序集以及類實例的所有數據成員均被寫入存儲媒體中。對象通常用成員變量來存儲對其他實例的引用。類序列化后,序列化引擎將跟蹤所有已序列化的引用對象,以確保同一對象不被序列化多次。.NET 框架所提供的序列化體系結構可以自動正確處理對象圖表和循環引用。對對象圖表的唯一要求是,由正在進行序列化的對象所引用的所有對象都必須標記為 Serializable(請參閱基 本序列化)。否則,當序列化程序試圖序列化未標記的對象時將會出現異常。當反序列化已序列化的類時,將重新創建該類,並自動還原所有數據成員的值。
2) 在網絡上傳送對象的字節序列。
對象僅在創建對象的應用程序域中有效。除非對象是從MarshalByRefObject派生得到或標記為 Serializable,否則,任何將對象作為參數傳遞或將其作為結果返回的嘗試都將失敗。如果對象標記為 Serializable,則該對象將被自動序列化,並從一個應用程序域傳輸至另一個應用程序域,然后進行反序列化,從而在第二個應用程序域中產生出該對象的一個精確副本。此過程通常稱為按值封送。如果對象是從MarshalByRefObject派生得到,則從一個應用程序域傳遞至另一個應用程序域的是對象引用,而不是對象本身。也可以將從MarshalByRefObject派生得到的對象標記為Serializable。遠程使用此對象時,負責進行序列化並已預先配置為SurrogateSelector的格式化程序將控制序列化過程,並用一個代理替換所有從MarshalByRefObject派生得到的對象。如果沒有預先配置為SurrogateSelector,序列化體系結構將遵從下面的標准序列化規則.
序列化和反序列化的主要作用有:
1、在進程下次啟動時讀取上次保存的對象的信息
2、在不同的AppDomain或進程之間傳遞數據
3、在分布式應用系統中傳遞數據
.............
常見的序列化的方法:
1、BinaryFormatter
2、SoapFormatter
3、XML序列化
用法:
BinaryFormatter的用法大致如下:
//BinaryFormatter將對象序列化到文件中
List<string> inputList = new List<string>() { "潮流時尚公子","http://gz168168.taobao.com","歡迎專注技術的程序袁來看看筆者的網店哦"};
using (FileStream fsWriter = new FileStream(@"gz168168.tmp",FileMode.Create,FileAccess.Write))
{
BinaryFormatter bf = new BinaryFormatter();
//序列化
bf.Serialize(fsWriter, inputList);
}
//BinaryFormatter將文件中的數據反序列化出來
List<string> outputList = new List<string>();
using (FileStream fsReader = new FileStream(@"gz168168.tmp",FileMode.Open,FileAccess.Read))
{
BinaryFormatter bf = new BinaryFormatter();
//反序列化
outputList = (List<string>)bf.Deserialize(fsReader);
}
XML序列化的用法大致如下:
//xml序列化到test.xml文件中
List<string> inputList = new List<string>() { "潮流時尚公子","http://gz168168.taobao.com"};
using (FileStream fsWriter = new FileStream(@"test.xml",FileMode.Create,FileAccess.Write))
{
XmlSerializer xs = new XmlSerializer(typeof(List<string>));
xs.Serialize(fsWriter, inputList);
}
//從test.xml文件中反序列化出來
List<string> outputList = new List<string>();
using (FileStream fsReader = new FileStream(@"test.xml",FileMode.Open,FileAccess.Read))
{
XmlSerializer xs = new XmlSerializer(typeof(List<string>));
outputList = xs.Deserialize(fsReader) as List<string>;
}
總結:
兩個的用法大致如下:
序列化:
1.得到一個存儲對象的類型
2.創建一個寫入文件流
3.定義要序列化的類型
4.調用序列化方法
反序列化:
1.定義一個裝載對象的類型
2.創建一個讀出文件流
3.定義要反序列化的類型
4.調用反序列化方法
BinaryFormatter類進行序列化和反序列化,以縮略型二進制格式寫到一個文件中去,速度比較快,而且寫入后的文件已二進制保存有一定的保密效果。標記為NonSerialized的其他所有成員都能序列化。
采用xml序列化的方式只能保存public的字段和可讀寫的屬性,對於private等類型的字段不能進行序列化。
二進制序列化的優點:
1. 所有的類成員(包括只讀的)都可以被序列化;
2. 性能非常好。
XML序列化的優點:
1. 互操作性好;
2. 不需要嚴格的二進制依賴;
3. 可讀性強