進階之路—序列化及反序列化二進位制、Soap、XML篇

weixin_33670713發表於2017-09-15

在程式設計中我們時常聽到序列化和反序列化這兩個詞,但是對於一些剛入門的新手來講,序列化和反序列化是什麼東西,又不得而知,其實序列化和反序列化並沒有我們相像的那麼複雜和困難。舉個例子:

7650239-37ed8edae0ee9244.png
序列化反序列化圖解

上圖應該很清晰了,假如我們在傳輸的過程中,想要把一個實體物件 A 傳給 b 這臺機器,但是傳送的管道過小,沒辦法將 A整體傳過去,那麼我們先將 A 打碎,然後傳過去之後在進行重組,打碎的過程就叫做序列化,重組的過程就叫做反序列化。

序列化和反序列化在 C# 中可以通過多種方式實現,格式不同,生成的檔案大小也各不相同,當前比較流行的格式有以下幾種:Soap, XML , Json , 二進位制。接下來我們就一起探究一下以上幾種格式序列化的方法以及優劣性。

首先是二進序列化的方式:物件序列化之後是二進位制格式的,通過 BinaryFormatter 類實現,該類位於 System.Runtime.Serialization.Formatters.Binary 名稱空間下。

我們新建一個空的解決方案,在解決方案中分別填加以下控制檯程式:BinarySerialize ,JsonSerialize ,SoapSerialize ,XmlSerialize 以及 Model 類庫。

7650239-5b8684cc5cedaa29.png
程式目錄

首先進行 Model 中實體物件的建立:

7650239-803db2cd6eafb63e.png
實體物件建立

需要注意,想要使用序列化器對這個類生成的物件序列化,需要在這個類上標識一個特性 [ Serializable ]

[ Serializable ]:表示標識的類是可以被序列化的。

接下來在 BinarySerialize 控制檯程式下,我們新增以下程式碼:

7650239-1220b1b7cb27c05b.png
二進位制序列化反序列化的程式碼

以上程式碼中,我們通過讀寫流的方式,在電腦D盤建立了一個檔案,並將序列化之後的物件傳入到該檔案中去,之後又將檔案中的二進位制內容取出反序列化成一個物件實體。

7650239-9c7cc0546c2d0386.png
生成的檔案和序列化後的二進位制片段

我們可以看到,這樣序列化就成功了,因為是二進位制的格式,所以很難讀懂。

7650239-3c65ac9f9c790dc7.png
反序列化生成的實體物件

而接下來的反序列化也沒有讓我們失望,成功的將檔案流中的二進位制片段轉換成了實體物件。

Soap 序列化器進行序列化:物件序列化之後的結果符合 Soap 協議,也就是可以通過 Soap 協議傳輸,通過 System.Runtime.Serialization.Formatters.Soap 名稱空間下的 SoapFormatte r類來實現的。

以下是 Soap 序列化的後臺程式碼:

7650239-a398a8d532acb868.png

可以看出,跟二進位制的程式碼基本是一樣的,區別在於呼叫的序列化器不同並且需要注意的是 Soap 序列化器不支援序列化泛型所以要在實體物件後後面 toArray() 一下,將其裝換成陣列。接下來我們執行試一試。

7650239-f145b36685c7f697.png
生成的檔案以及soap片段
7650239-3d651c049ac6f693.png
反序列化出來的物件

上面兩張圖證明我們已經成功的序列化以及反序列化除了這個物件,而生成的檔案開啟之後我們發現,雖然不好閱讀,但是也能找到我們需要的資料。

XML序列化:物件序列化之後的結果是 XML形式的,通過 XmlSerializer 類來實現的,該類位於 System.Xml.Serialization 名稱空間下。XML序列化不能序列化私有資料。

7650239-a96c1109695a288a.png
xml序列化的後臺程式碼

上面 XML 序列化的程式碼與二進位制和 Soap 的相差不大,除了序列化器名稱不一樣之外還需注意的是, XML 序列化器在建立的時候需要給其指定物件型別。

7650239-711f9c39763dd298.png
序列化成功建立的檔案
7650239-f006d8295899e229.png
反序列化後的物件

上面兩張圖證明了我們程式碼是可以成功執行的,而且 XML 格式的檔案可讀性要比另外兩種好的太多了。

相關文章