1. 程式人生 > >Google_Protobuf協議——Protobuf語法

Google_Protobuf協議——Protobuf語法

protobuf的語法圍繞著字尾為.proto的檔案進行構建。

語法協議規則:syntax

目前的語法協議規則最新支援proto3
在檔案描述為

yntax = "proto3";

每個.proto檔案必須闡明支援的語法協議規則。
不同的規則要求的語法不一樣,生成的.cc和.h檔案也不一樣,不能混用。

名稱空間修飾:package

proto可以使用名稱空間對該檔案的所有內容進行匡制,名稱空間的層級通過.進行延伸。

package zxtest.prototest;

生成的.cc和.h檔案即有名稱空間的匡制

namespace zxtest {
namespace
prototest {

名稱空間語法可以不加,不是必要的語法。

包含其他proto檔案:import

proto檔案可以引用其他proto檔案的內容,關鍵字修飾後面加上引用的檔案路徑。

import "user.proto";
import "log.proto";

proto只能向下引用,不能解釋“../”或“..\路徑”,編譯時會報錯。

Backslashes, consecutive slashes, ".", or ".." are not allowed in the virtual path

工程構建禁止將proto檔案分開放。若分開放就必須為其編寫Makefile,定義輸出路徑。

註釋

和C與C++一樣,proto檔案通過“//”和“/**/”來註釋。

3.5 資料型別
proto檔案支援多種資料型別。

1、常見型別

string  :字串型別
int32   :整型
uint32  :無符號整型
sint32  :有符號整型
bool    :布林型別
float   :浮點型

2、列舉enum,在proto檔案的定義,欄位間隔為;

enum Recode {
    SUCCESS = 0;
    ERROR = 1;
};

訊息體:message

proto檔案就是圍繞著訊息體進行通訊的,不同的協議規則對應不同的描述,本次闡述的是“proto3”的規則協議。

訊息體內容組成:

[欄位修飾] <資料型別|訊息體|引用外部訊息體> <名稱> = <編號>

欄位修飾

required:宣告該值是必要的值,不能為空(proto3捨棄)
optional:宣告該值是可選的值,可以為空(proto3捨棄)
//proto3捨棄以上兩種修飾,值都能為空

repeated:宣告該值為多個數值,可以組成陣列的形式

“proto3”僅僅支援repeated欄位修飾,如果使用required,optional編譯會報錯。

Required fields are not allowed in proto3.
Explicit 'optional' labels are disallowed in the Proto3 syntax. To define 'optional' fields in Proto3, simply remove the 'optional' label, as fields are 'optional' by default.

“proto2”與“proto3”規則不相容,將syntax = “proto2”之後,欄位都需要強制加修飾,不然會報錯。

Expected "required", "optional", or "repeated".

編號規則

message Testmessage {
    string                  name        = 1;
    Recode                  enumcode    = 2;
    repeated uint32         u32number   = 3;
    TestSendArray           Msg_array   = 4;
    zxtest.user.UserInfo    info        = 5;
}

引用外部型別有名稱空間的一定要加名稱空間延伸描述,編號必須是正整數,不然會報錯。

Field numbers must be positive integers.

編號順序非必須連續,因為生成的程式碼是用switch檢索。