天天看點

(4.2.33)Google出品的Protocol Buffer參考文獻

文章目錄

  • 參考文獻
  • 序列化的本質:對資料進行編碼 + 存儲
  • Protocol Buffer的性能好:傳輸效率快,主要原因 = 序列化速度快 & 序列化後的資料體積小,其原因如下:
    1. 序列化速度快的原因:

      a. 編碼 / 解碼 方式簡單(隻需要簡單的數學運算 = 位移等等)

      b. 采用 PB 自身的架構代碼 和 編譯器 共同完成

    2. 序列化後的資料量體積小(即資料壓縮效果好)的原因:

      a. 采用了獨特的編碼方式,如Varint、Zigzag編碼方式等等

      b. 采用T - L - V (Tag - Length - Value,辨別 - 長度 - 字段值)的資料存儲方式:減少了分隔符的使用 & 資料存儲得緊湊

  • Varint編碼方式介紹
    • i. 簡介
    • 定義:一種變長的編碼方式
    • 原理:用位元組 表示 數字:值越小的數字,使用越少的位元組數表示
    • 作用:通過減少 表示數字 的位元組數 進而進行資料壓縮
    • 問題:如果采用 Varint編碼方式 表示一個負數,那麼一定需要 5 個 byte(因為負數的最高位是1,會被當做很大的整數去處理)
    • 解決方案: Protocol Buffer 定義了 sint32 / sint64 類型表示負數,通過先采用 Zigzag 編碼(将 有符号數 轉換成 無符号數),再采用 Varint編碼,進而用于減少編碼後的位元組數
如:
  • 對于 int32 類型的數字,一般需要 4個位元組 表示;
  1. 若采用 Varint編碼,對于很小的 int32 類型 數字,則可以用 1個位元組 來表示
  2. 雖然大的數字會需要 5 個 位元組 來表示,但大多數情況下,消息都不會有很大的數字,是以采用 Varint方法總是可以用更少的位元組數來表示數字
  • Zigzag編碼方式詳解
    • i. 簡介
    • 定義:一種變長的編碼方式
    • 原理:使用 無符号數 來表示 有符号數字;
    • 作用:使得絕對值小的數字都可以采用較少 位元組 來表示;

參考文獻

  • 快來看看Google出品的Protocol Buffer,别隻會用Json和XML了
  • Protocol Buffer 序列化原理大揭秘 - 為什麼Protocol Buffer性能這麼好?