protobuf解析(一)
阿新 • • 發佈:2019-01-27
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,因為其實我們大多數情況下都用一些小負值,用這種方法又節約了位元組數。