在Thrift,Protobuf和avro序列化框架中,不約而同使用了zigzag編碼來對數字進行編碼,從而達到減少數據傳輸量的目的。
zigzag算法的核心主要是去除二進制數字中的前導0,因爲在絕大多數情況下,我們使用到的整數,往往是比較小的。
在avro編碼中,對於字符串Martin,長度爲6,而6的二進制爲0000 0110,其中首位置的0爲符號位,在zigzag編碼中,正數的符號位會移動到末尾,其它位往前移動一位,所以會變成0000 1100,即0c,再後面的字節是字符串UTF-8編碼後的結果
在protobuf編碼中,對於字符串的Martin,剛開始的字節表示其id和數據類型,下一個字節表示其長度,後面的字節是字符串UTF-8編碼後的結果
參考:《數據密集型應用系統設計》的 Schema evolution in Avro, Protocol Buffers and Thrift
Avro,Protocol Buffer和Thrift中的模式演化(譯)