序列化和反序列化

序列化也叫做編碼,是指將對象轉換成字節數組,用於在網絡傳輸,數據持久化。

反序列化也叫作解碼,是指將字節數組還原成原始對象,以方便進行後續的業務邏輯操作。

 

序列化方式

1. 文本類序列化方式,JSON ,XML

2.二進制序列化方式,Protobuf,Thrift

 

序列化方式和通信協議是解耦的。同一種通信協議可以有多種序列化方式承載。

比如HTTP協議,序列化方式可以是XML,可以是JSON,也可以是圖片附件等二進制。

 

關於 ProtoBuf 的一些思考

官方文檔以及網上很多文章提到 ProtoBuf 可類比 XML 或 JSON。

那麼 ProtoBuf 是否就等同於 XML 和 JSON 呢,它們是否具有完全相同的應用場景呢?

個人認爲如果要將 ProtoBuf、XML、JSON 三者放到一起去比較,應該區分兩個維度。一個是數據結構化,一個是數據序列化。這裏的數據結構化主要面向開發或業務層面,數據序列化面向通信或存儲層面,當然數據序列化也需要“結構”和“格式”,所以這兩者之間的區別主要在於面向領域和場景不同,一般要求和側重點也會有所不同。數據結構化側重人類可讀性甚至有時會強調語義表達能力,而數據序列化側重效率和壓縮。

從這兩個維度,我們可以做出下面的一些思考。

XML 作爲一種擴展標記語言,JSON 作爲源於 JS 的數據格式,都具有數據結構化的能力。

例如 XML 可以衍生出 HTML (雖然 HTML 早於 XML,但從概念上講,HTML 只是預定義標籤的 XML),HTML 的作用是標記和表達萬維網中資源的結構,以便瀏覽器更好的展示萬維網資源,同時也要儘可能保證其人類可讀以便開發人員進行編輯,這就是面向業務或開發層面的數據結構化

再如 XML 還可衍生出 RDF/RDFS,進一步表達語義網中資源的關係和語義,同樣它強調數據結構化的能力和人類可讀。

JSON 也是同理,在很多場合更多的是體現了數據結構化的能力,例如作爲交互接口的數據結構的表達。在 MongoDB 中採用 JSON 作爲查詢語句,也是在發揮其數據結構化的能力。

當然,JSON、XML 同樣也可以直接被用來數據序列化,實際上很多時候它們也是這麼被使用的,例如直接採用 JSON、XML 進行網絡通信傳輸,此時 JSON、XML 就成了一種序列化格式,它發揮了數據序列化的能力。但是經常這麼被使用,不代表這麼做就是合理。實際將 JSON、XML 直接作用數據序列化通常並不是最優選擇,因爲它們在速度、效率、空間上並不是最優。換句話說它們更適合數據結構化而非數據序列化。

扯完 XML 和 JSON,我們來看看 ProtoBuf,同樣的 ProtoBuf 也具有數據結構化的能力,其實也就是上面介紹的 message 定義。我們能夠在 .proto 文件中,通過 message、import、內嵌 message 等語法來實現數據結構化,但是很容易能夠看出,ProtoBuf 在數據結構化方面和 XML、JSON 相差較大,人類可讀性較差,不適合上面提到的 XML、JSON 的一些應用場景。

但是如果從數據序列化的角度你會發現 ProtoBuf 有着明顯的優勢,效率、速度、空間幾乎全面佔優,看完後面的 ProtoBuf 編碼的文章,你更會了解 ProtoBuf 是如何極盡所能的壓榨每一寸空間和性能,而其中的編碼原理正是 ProtoBuf 的關鍵所在,message 的表達能力並不是 ProtoBuf 最關鍵的重點。所以可以看出 ProtoBuf 重點側重於數據序列化 而非 數據結構化

最終對這些個人思考做一些小小的總結:

  1. XML、JSON、ProtoBuf 都具有數據結構化數據序列化的能力
  2. XML、JSON 更注重數據結構化,關注人類可讀性和語義表達能力。ProtoBuf 更注重數據序列化,關注效率、空間、速度,人類可讀性差,語義表達能力不足(爲保證極致的效率,會捨棄一部分元信息)
  3. ProtoBuf 的應用場景更爲明確,XML、JSON 的應用場景更爲豐富。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章