淺析.NET中的Serialization
2024-07-16 17:58:38
供稿:網友
摘要 本文簡要介紹了.NET中的序列化(Serialization)概念,以及在代碼中實作Serialization的方法。文章的最后介紹了Serialization在Clone方法中的運用。
Serialization的概念
Serialization是.NET中一種實現對象持久性(Persistent)的機制。它是一個將對象中的數據轉換成一個單一元素(通常是Stream)的過程。它的逆過程是Deserialization。Serialization的核心概念是將一個對象的所有數據看作一個獨立的單元。
一般說來,在兩種情況下非常需要Serialization:1)當我們希望能夠將對象當前的狀態完整地保存到存儲介質中,以便我們以后能夠精確地還原對象時;2)當我們希望將對象從一個應用程序空間(Application domain)傳遞到另一個應用程序空間時。例如,Windows Form程序就是利用Serialization機制來實現剪貼板的copy & paste的。
.net framework支持兩種類型的Serialization:Shallow Serialization和Deep Serialization。
所謂Shallow Serialization是將對象的可讀寫(read-write)屬性的值轉換成字節流,而對象內部的數據(沒有通過read-write屬性暴露出來的數據)則不被轉換。XmlSerializer以及Web Services就使用這種技術。
Deep Serialization比Shallow Serialization更加徹底,因為它是將存儲在對象私有變量里的實際值拷貝到字節流里。而且Deep Serialization還將serialize整個object graph。也就是說,如果你的對象持有其他對象的引用,或者其他對象引用的集合,那么所有這些對象都將被Serialize。BinaryFormatter和SoapFormatter以及.NET Remoting都使用Deep Serialization技術,它甚至被有限地用于LosFormatter來產生存儲在Web Form頁中的狀態數據。
本文將著重于Deep Serialization。
Serialization的過程
.NET Framework通過Reflection提供自動Serialization的機制。當一個對象被序列化(Serialized)的時候,它的類名,Assembly,以及類實例的所有數據成員都將被寫入存儲介質中。Serialization引擎保持對所有已經被序列化的對象引用的追蹤,以確保相同的對象引用最多只被序列化一次。
通常,一個Serialization過程會由formatter(例如BinaryFormatter)的Serialize方法引發。對象的Serialization過程按照以下規則進行:
1、 檢測以確保formatter是否擁有一個代理選擇器(surrogate selector)。如果有,檢查代理選擇器是否持有給定的對象類型。如果有,ISerializable.GetObjectData被調用。
2、 如果formatter沒有代理選擇器,或者代理選擇器沒有對象類型,檢查對象是否被用Serializable屬性標記。如果沒有,則拋出SerializationException異常。