物件序列化原因的簡單理解
序列化和反序列化我們可能經常會聽到,其實通俗一點的解釋,序列化就是把一個物件儲存到一個檔案或資料庫欄位中去,其最終目的都是將記憶體中的物件持久化或者是在網路上傳輸。反序列化就是在適當的時候把這個檔案再轉化成原來的物件使用。
使用序列化的原因
a. 一個原因是將物件的狀態保持在儲存媒體中,以便可以在以後重新建立精確的副本。我們經常需要將物件的欄位值儲存到磁碟中,並在以後檢索此資料。儘管不使用序列化也能完成這項工作,但這種方法通常很繁瑣而且容易出錯,並且在需要跟蹤物件的層次結構時,會變得越來越複雜。可以想象一下編寫包含大量物件的大型業務應用程式的情形,程式設計師不得不為每一個物件編寫程式碼,以便將欄位和屬性儲存至磁碟以及從磁碟還原這些欄位和屬性。序列化提供了輕鬆實現這個目標的快捷方法。
b.另一個原因是通過值將物件從一個應用程式域傳送到另一個應用程式域中。例如,序列化可用於在 ASP.NET 中儲存會話狀態並將物件複製到 Windows 窗體的剪貼簿中。遠端處理還可以使用序列化通過值將物件從一個應用程式域傳遞到另一個應用程式域中。公共語言執行時 (CLR) 管理物件在記憶體中的分佈,.NET 框架則通過使用反射提供自動的序列化機制。物件序列化後,類的名稱、程式集以及類例項的所有資料成員均被寫入儲存媒體中。物件通常用成員變數來儲存對其他例項的引用。類序列化後,序列化引擎將跟蹤所有已序列化的引用物件,以確保同一物件不被序列化多次。.NET
框架所提供的序列化體系結構可以自動正確處理物件圖表和迴圈引用。對物件圖表的唯一要求是,由正在進行序列化的物件所引用的所有物件都必須標記為 Serializable(請參閱基本序列化)。否則,當序列化程式試圖序列化未標記的物件時將會出現異常。
物件序列化有兩種方式,一種方式是二進位制流的方式,另外一種是XML的方式。二進位制流的方式,比較快,而且佔用的空間比較小。因為是直接對映序列化成0,1序列,然後存在一個二進位制檔案中,這個檔案用記事本是打不開的,即使開啟也是亂碼,因為就像dll一樣,是二進位制。而序列化XML檔案,是先轉換成符合一定格式的字XML符串,存在檔案中,這個檔案是可以用記事本開啟的。然後在傳輸的時候,字串對應的ASCII碼,轉換成對應 0,1,最終傳輸到網路上。所以這樣做比較繞彎,但是相對於第一種,應用更普遍。因為XML我們可以作為Log保留下來。
以上是序列化的作用以及方式,下邊是其一些負面內容。
A major disadvantage is that the content of the file where you serialize an object in will be tightly coupled to your source code. If you change something in the source code of the class, then you can't read serialized objects that were stored with the old version of the class anymore. 這句話是說,就是序列化相關的程式碼是高度耦合的,比如說,XSD內容發生了變化,那麼其對應的物件也就要發生變化,這樣就要變動程式碼。That problem becomes a nightmare when you are writing software that's used by customers. Suppose that you publish version 1.1 of your program, and people have files saved with version 1.0. Now version 1.1 can't read those files anymore because you've changed the class. You also don't have any control over the exact file format.
舉個例子來說,現在用Message Queue來作為企業系統整合的中介軟體。有A和B兩個系統需要整合,A系統向某個Queue裡邊寫入資料,B系統去讀取這個Queue裡邊的XML訊息。做法是,A系統與B系統的開發人員要事先去協商,B要說明需要什麼資料,A要明白提供什麼資料,然後兩者規定一種XML格式,即XSD檔案。A系統按照規定的格式將訊息放到了Queue伺服器中。此時B系統收到XML後,可以使用Linq to XML來獲取相應的屬性,但是這樣做很繁瑣。普遍做法是,根據XSD生成對應的Class載體,然後呼叫C#的Deserilize方法將XML反序列化成記憶體物件。現在問題就來了,如果A系統變了XSD,那麼B系統XSD相關程式碼就要重寫,這就是為什麼說耦合性高。