1. 程式人生 > >protobuf解析(一)

protobuf解析(一)

protobuf是一種新的訊息或資料結構體的定義模式。我們來看下基本寫法:
1. 基本資料型別:包括double、float、bool、string、bytes、int32、int64、uint32、uint64、sint32、sint64、fixed32、fixed64、sfixed32、sfixed64;
2. 引用其他message型別
3. 列舉型別:對於列舉型別,protobuf有個約束:列舉的第一項對應的值必須為0;下面是一個包含列舉型別的訊息定義
4. import其他proto檔案

import "myproject/other_protos.proto";  //引入外部proto
message Count { string type =1; int32 num =2; } message SearchRequest { string query = 1; int32 page_number = 2; int32 result_per_page = 3; enum Corpus { UNIVERSAL = 0; WEB = 1; IMAGES = 2; LOCAL = 3; NEWS = 4; PRODUCTS = 5; VIDEO = 6; } Corpus corpus = 4
; //enum型別使用 repeated Count counts =5; // message引用 oneof user_identifier { // oneof使用 string user_name = 6; string phone_num = 7; string user_email = 8; } }

介紹完了基本用法,我們先岔開一下,為什麼用protobuf替代json或xml呢?
答案是節省資源,protobuf用了特殊的編碼方式使結構更緊湊
1. Varint編碼
它用一個或多個位元組來表示一個數字,值越小的數字使用越少的位元組數。這能減少用來表示數字的位元組數。Varint 中的每個 byte 的最高位 bit 有特殊的含義,如果該位為 1,表示後續的 byte 也是該數字的一部分,如果該位為 0,則結束。其他的 7 個 bit 都用來表示數字。對於int32的資料,小於 128 的數字只需要1位元組而不是原先的4位元組來傳遞或儲存
2. ZigZag編碼
這是一種將負數用小正數來mapping,因為其實我們大多數情況下都用一些小負值,用這種方法又節約了位元組數。
這裡寫圖片描述