protobuf入門教程(二):訊息型別
阿新 • • 發佈:2019-01-27
操作流程
1)在.proto檔案中定義訊息格式
2)使用protobuf編譯器生成C++類
3)使用C++ API來讀寫訊息
訊息格式
syntax = "proto3"; //指定版本資訊,不指定會報錯
message Person //message為關鍵字,作用為定義一種訊息型別
{
string name = 1; //姓名
int32 id = 2; //id
string email = 3; //郵件
}
訊息由至少一個欄位組合而成,類似於C語言中的結構體,每個欄位都有一定的格式:
資料型別 欄位名稱 = 唯一的編號標籤值;
- 欄位名稱:protobuf建議以下劃線命名而非駝峰式
- 唯一的編號標籤:代表每個欄位的一個唯一的編號標籤,在同一個訊息裡不可以重複。這些編號標籤用與在訊息二進位制格式中標識你的欄位,並且訊息一旦定義就不能更改。需要說明的是標籤在1到15範圍的採用一個位元組進行編碼,所以通常將標籤1到15用於頻繁發生的訊息欄位。編號標籤大小的範圍是1到229。此外不能使用protobuf系統預留的編號標籤(19000 ~19999)。
資料型別
.proto型別 | C++型別 | 備註 |
---|---|---|
double | double | 64位浮點數 |
float | float | 32位浮點數 |
int32 | int32 | 32位整數 |
int64 | int64 | 64位整數 |
uint32 | uint32 | 32位無符號整數 |
uint64 | uint64 | 64位無符號整數 |
sint32 | int32 | 32位整數,處理負數效率比int32更高 |
sint32 | sint64 | 64位整數,處理負數效率比int64更高 |
fixed32 | uint32 | 總是4個位元組。如果數值總是比總是比228大的話,這個型別會比uint32高效。 |
fixed64 | uint64 | 總是8個位元組。如果數值總是比總是比256大的話,這個型別會比uint64高效。 |
sfixed32 | int32 | 總是4個位元組 |
sfixed64 | int64 | 總是8個位元組 |
bool | bool | 布林型別 |
string | string | 一個字串必須是UTF-8編碼或者7-bit ASCII編碼的文字 |
bytes | string | 處理多位元組的語言字元、如中文 |
enum | enum | 列舉 |
message | object of class | 自定義的訊息型別 |
proto檔案
proto檔案即訊息協議原型定義檔案,在該檔案中我們可以通過使用描述性語言,來良好的定義我們程式中需要用到資料格式。
通過檢視標頭檔案,可以發現針對每個欄位都會大致生成如下幾種函式,以name為例:
void clear_name();
void set_name(const ::std::string& value);
void set_name(const char* value);
void set_name(const char* value, size_t size);
const ::std::string& name() const;
::std::string* mutable_name();
可以看出,對於每個欄位會生成一個clear清除函式(clear_name)、set函式(set_name)、get函式(name和mutable_name)。
這兒解釋下get函式中的兩個函式的區別: 對於原型為const std::string &number() const的get函式而言,返回的是常量欄位,不能對其值進行修改。但是在有一些情況下,對欄位進行修改是必要的,所以提供了一個mutable版的get函式,通過獲取欄位變數的指標,從而達到改變其值的目的。