1. 程式人生 > >protobuf入門教程(二):訊息型別

protobuf入門教程(二):訊息型別

操作流程

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函式,通過獲取欄位變數的指標,從而達到改變其值的目的。