怎麼選擇數據序列化方案?

什麼是序列化和反序列化

當數據在網絡上傳輸時,傳輸數據的基本形式是二進制流,要想使用網絡框架的API來傳輸結構化的數據,必須得先實現結構化的數據和字節流之間的雙向轉換。將結構化數據轉換成字節流的過程稱爲序列化,將字節流轉換成結構化數據的過程稱爲反序列化。

序列化除了用於在網絡上傳輸數據之外,還可以將結構化的數據保存在文本中,因爲在文件內數據的形式也是二進制序列,和網絡傳輸過程中的數據是一樣的,所以序列化同樣適用於將結構化數據保存到文本中。

怎麼選擇序列化實現?

我們有很多種通用的序列化實現方案,既包括了編程語言彙總內置的實現,也有各種開源方案。

當我們爲項目選擇合適的序列化方案時,可以考慮以下因素:

  1. 序列化後的數據易於人類閱讀。
  2. 實現的複雜度是否足夠低。
  3. 序列化和反序列化的速度越快越好。
  4. 序列化後的信息密度越大越好,即同樣的一個結構化數據,序列化後佔用的存儲空間越小越好。
  5. 序列化和反序列化的過程都是安全的。

沒有任何一種序列化方案可以滿足上面所有條件,例如可讀性和信息密度就是兩個相悖的條件。

對於一些強業務類系統,例如電商、社交類的應用,它們業務複雜、需求變化快,但是對性能要求沒有那麼嚴苛,這種情況下,我們可以使用JSON這種實現簡單、數據可讀性好的序列化方案,方便後期接口調試和問題排查。

實現高性能的序列化和反序列化

有些中間件會對網絡通信的性能要求比較高,例如消息隊列,普通的序列化無法達到性能要求,這時,一般會選擇定製實現高性能的轉用序列化和反序列化方案,可以有效減少序列化後的字節長度。

例如,針對下面的數據內容:

User:
  name: "zhangsan"
  age: 23
  married: true

使用普通的JSON序列化方式,結果如下:

{"name":"zhangsan","age":"23","married":"true"}

我們可以考慮使用固定字段順序的方式,在序列化後的內容中不必包含字段名,只需要字段值,結果如下:

03   | 08 7a 68 61 6e 67 73 61 6e | 17 | 01
User |    z  h  a  n  g  s  a  n  | 23 | true

上述序列化後的內容,我們按照name、age、married的固定順序來序列化這三個屬性。

可以看到同樣的對象,JSON序列化後需要47個字節,採用特定方式序列化後的內容只需要12個字節。

專用的序列化方式更加高效,序列化出來的字節更少,在網絡傳輸過程彙總的速度也更快,但確定是需要爲每種對象類型定義專門的序列化和反序列化方法,實現過程複雜。

因此,針對序列化方案選型,大多數情況下, 選擇一個高性能的通用序列化框架都可以滿足要求,在性能可以滿足需求的前提下,推薦優先選擇JSON這種可讀性好的序列化方法。如果我們需要超高的性能或者帶寬非常有限,那麼我們可以使用專用的序列化方法來提升性能,節省傳輸流量。

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