進階之路—序列化及反序列化二進位制、Soap、XML篇
在程式設計中我們時常聽到序列化和反序列化這兩個詞,但是對於一些剛入門的新手來講,序列化和反序列化是什麼東西,又不得而知,其實序列化和反序列化並沒有我們相像的那麼複雜和困難。舉個例子:
![7650239-37ed8edae0ee9244.png](https://i.iter01.com/images/08e4e23fa08efc245ed46271ced8e43a95c084d726da8ac24aa78cfd658b22ad.png)
上圖應該很清晰了,假如我們在傳輸的過程中,想要把一個實體物件 A 傳給 b 這臺機器,但是傳送的管道過小,沒辦法將 A整體傳過去,那麼我們先將 A 打碎,然後傳過去之後在進行重組,打碎的過程就叫做序列化,重組的過程就叫做反序列化。
序列化和反序列化在 C# 中可以通過多種方式實現,格式不同,生成的檔案大小也各不相同,當前比較流行的格式有以下幾種:Soap, XML , Json , 二進位制。接下來我們就一起探究一下以上幾種格式序列化的方法以及優劣性。
首先是二進序列化的方式:物件序列化之後是二進位制格式的,通過 BinaryFormatter 類實現,該類位於 System.Runtime.Serialization.Formatters.Binary 名稱空間下。
我們新建一個空的解決方案,在解決方案中分別填加以下控制檯程式:BinarySerialize ,JsonSerialize ,SoapSerialize ,XmlSerialize 以及 Model 類庫。
![7650239-5b8684cc5cedaa29.png](https://i.iter01.com/images/c88820cf9148dcce5dd6536fdca3ed61ddbd3852941407f0be482ce44a215312.png)
首先進行 Model 中實體物件的建立:
![7650239-803db2cd6eafb63e.png](https://i.iter01.com/images/45376e16d27c8ade8776881a1c08da70b205ddbfec5c81e141b6ef27b1daa846.png)
需要注意,想要使用序列化器對這個類生成的物件序列化,需要在這個類上標識一個特性 [ Serializable ]
[ Serializable ]:表示標識的類是可以被序列化的。
接下來在 BinarySerialize 控制檯程式下,我們新增以下程式碼:
![7650239-1220b1b7cb27c05b.png](https://i.iter01.com/images/e2ea08bd44f5e707cc5977346955719b1edad9ed50513ecc66a508b1e5df2c35.png)
以上程式碼中,我們通過讀寫流的方式,在電腦D盤建立了一個檔案,並將序列化之後的物件傳入到該檔案中去,之後又將檔案中的二進位制內容取出反序列化成一個物件實體。
![7650239-9c7cc0546c2d0386.png](https://i.iter01.com/images/76c29acee444ea1b04a0e6678911719093fd5590387c1418a30ea486eb8266fa.png)
我們可以看到,這樣序列化就成功了,因為是二進位制的格式,所以很難讀懂。
![7650239-3c65ac9f9c790dc7.png](https://i.iter01.com/images/cbc0866381728ff7e1c7538f4c6680a0de105e8d2ba515b7c7ad204b156ba4bd.png)
而接下來的反序列化也沒有讓我們失望,成功的將檔案流中的二進位制片段轉換成了實體物件。
Soap 序列化器進行序列化:物件序列化之後的結果符合 Soap 協議,也就是可以通過 Soap 協議傳輸,通過 System.Runtime.Serialization.Formatters.Soap 名稱空間下的 SoapFormatte r類來實現的。
以下是 Soap 序列化的後臺程式碼:
![7650239-a398a8d532acb868.png](https://i.iter01.com/images/a4e1c93f9d66f9cc9ee896f486c5ddc3aacbb8f50641270c6a7c90821f2aa0e0.png)
可以看出,跟二進位制的程式碼基本是一樣的,區別在於呼叫的序列化器不同並且需要注意的是 Soap 序列化器不支援序列化泛型所以要在實體物件後後面 toArray() 一下,將其裝換成陣列。接下來我們執行試一試。
![7650239-f145b36685c7f697.png](https://i.iter01.com/images/0076c90ebfb410dad56d835d9cf3845afa9b0abe61fdd222d362953f0fff8c70.png)
![7650239-3d651c049ac6f693.png](https://i.iter01.com/images/f8afa19eb36d7850dc5b7bc1a89a5afd71582250528e7980f64d5c0a0daa64f2.png)
上面兩張圖證明我們已經成功的序列化以及反序列化除了這個物件,而生成的檔案開啟之後我們發現,雖然不好閱讀,但是也能找到我們需要的資料。
XML序列化:物件序列化之後的結果是 XML形式的,通過 XmlSerializer 類來實現的,該類位於 System.Xml.Serialization 名稱空間下。XML序列化不能序列化私有資料。
![7650239-a96c1109695a288a.png](https://i.iter01.com/images/c06be5d2325c4d9dae318486214012da99e105f69af06a869834a32010f32766.png)
上面 XML 序列化的程式碼與二進位制和 Soap 的相差不大,除了序列化器名稱不一樣之外還需注意的是, XML 序列化器在建立的時候需要給其指定物件型別。
![7650239-711f9c39763dd298.png](https://i.iter01.com/images/acc816651ac4c1b0e331ee63c852f75f0764537832a1642c387ec956e126a0ae.png)
![7650239-f006d8295899e229.png](https://i.iter01.com/images/b3f4308c946f317e656a655513dc1f08ba8bc63ed543ab191e11925f9bf9d6d0.png)
上面兩張圖證明了我們程式碼是可以成功執行的,而且 XML 格式的檔案可讀性要比另外兩種好的太多了。
相關文章
- 二進位制反碼求和
- 進位制與二進位制及相關轉換
- .NET進階篇04-Serialize序列化、加密解密加密解密
- 進位制詳解:二進位制、八進位制和十六進位制
- JavaScript 二進位制、八進位制與十六進位制JavaScript
- 二進位制與二進位制運算
- 效能超四倍的高效能.NET二進位制序列化庫
- 用 python 修改二進位制的 AndroidManifest.xmlPythonAndroidXML
- Android逆向(一) —— AndroidManifest.xml 二進位制解析AndroidXML
- 二進位制,八進位制,十進位制,十六進位制的相互轉換
- 【進位制轉換】二進位制、十六進位制、十進位制、八進位制對應關係
- 十進位制——二 (八、十六 )進位制
- 序列化篇 生成xml 以及讀取xmlXML
- JAVA 二進位制,八進位制,十六進位制,十進位制間進行相互轉換Java
- java中二進位制、八進位制、十進位制、十六進位制的轉換Java
- 二進位制,八進位制,十進位制,十六進位制之間的轉換
- 計算機基礎進位制轉換(二進位制、八進位制、十進位制、十六進位制)計算機
- 二進位制、十進位制與十六進位制相互轉化
- 二進位制
- (二進位制)
- 二進位制轉十進位制快速方法
- 理解二進位制原碼、反碼、補碼
- React 進階之路(二)React
- 深入認識二進位制序列化--記一次生產事故的思考
- [計算機基礎] 計算機進位制轉換:二進位制、八進位制、十進位制、十六進位制計算機
- LeetCode刷題之路:67. 二進位制求和LeetCode
- 什麼是二進位制?二進位制如何轉換?
- 進位制之間的轉換之“十六進位制 轉 十進位制 轉 二進位制 方案”
- 一看就懂二進位制、八進位制、十六進位制數轉換十進位制
- JavaScript十進位制轉換為二進位制JavaScript
- 十進位制轉二進位制推導(草稿)
- Cocoapods 二進位制
- 04 二進位制
- leetcode -- 二進位制LeetCode
- [二進位制漏洞]棧(Stack)溢位漏洞 Linux篇Linux
- XML序列化XML
- 整數轉化成八進位制、十六進位制、二進位制,以及轉回
- 二進位制原碼、反碼、補碼詳解
- xml序列化和反序列化(一)XML