先介紹幾個經常使用關鍵字:數組
equired前綴表示該字段爲必要字段,既在序列化和反序列化以前該字段必須已經被賦值。與此同時,在Protocol Buffer中還存在另外兩個相似的關鍵字,optional和repeated,帶有這兩種限定符的消息字段則沒有required字段這樣的限制。相比於optional,repeated主要用於表示數組字段佈局
標籤數字1和2、3則表示不一樣的字段在序列化後的二進制數據中的佈局位置優化
對於Protocol Buffer而言,標籤值爲1到15的字段在編碼時能夠獲得優化,即標籤值和類型信息僅佔有一個byte,標籤範圍是16到2047的將佔有兩個bytes,而Protocol Buffer能夠支持的字段數量則爲2的29次方減一。有鑑於此,咱們在設計消息結構時,能夠儘量考慮讓repeated類型的字段標籤位於1到15之間,這樣即可以有效的節省編碼後的字節數量ui
Extentionsgoogle
extensions 聲明一個消息中的必定範圍的field的順序數字用於進行擴展。其它人能夠在本身的.proto文件中從新定義這些消息field,而不須要去修改原始的.proto文件編碼
message Foo {scala
// .....設計
extensions 100 to 199;string
}io
這些說明100-199的field是保留的。其它用戶能夠用這些field在他們本身的.proto文件中添加新的fields給Foo。舉例:
extend Foo {
optional int32 bar = 126;
}
很是重要的一點是雙方不能使用一樣數字添加同樣的message類型,這樣extension會被解釋爲錯誤類型。
可能須要有一個關於field的數字順序的約定來保證你的project不會發生這樣的重複的問題。
若是你的field數字比較大的話,可使用max來指定你的textension範圍上升到最大的範圍
message Foo {
extensions 1000 to max;
}
沒有指定默認值的話,string 默認爲空串,bool 默認爲false,數字類型默認0,枚舉類型,默認爲類型定義中的第一個值
1. proto文件基礎寫法
syntax = "proto3"; //syntax = 「proto3」:表示這是使用protobuf3的語法,不加這句默認使用protobuf2的語言
message Person { // message相似class
string name = 1; // 1 表示這個字段存儲的位置
int32 id = 2; // 字段格式:限定符① | 數據類型② | 字段名稱③ | = | 字段編碼值④ | [字段默認值⑤]
string email = 3;
bytes image = 4; // 定義nsndata
bool isHave = 5;
map<string, string> projects = 6; // 定義字典
repeated string array = 7; // 定義數組
float numFool = 8;
double numDouble = 9;
}
// 限定符: singular,repeated
//singular:一個正肯定義的消息包含零或者1個該field.不超過1個
//repeated:能夠添加多個,至關於一個數組.排列順序就是添加時的順序.protobuf3對scalar數字類型的repeated限定默認都是packed的,這樣能夠節省不少空間,共用一個key,減小了key的佔用.
// 在當前目錄即可以看到Test.pbobjc.h和Test.pbobjc.m這兩個文件了(須要注意的是生成的代碼是MRC的,若是引入ARC工程中記得添加-fno-objc-arc的標籤).
2.
syntax = "proto3"; //syntax = 「proto3」:表示這是使用protobuf3的語法,不加這句默認使用protobuf2的語言
message Person {
string name = 1;
int32 id = 2;
PhoneNumber pp = 3; // // 能夠嵌套
PhoneType type = 5; // 可使用枚舉
repeated PhoneNumber phone = 4; //
}
message PhoneNumber {
string number = 1;
PhoneType type = 2 ;
}
enum PhoneType {
//enum類型必須有一個明確是0的字段,這個一是爲了和protobuf2兼容,而是使其有個默認值
MOBILE = 0;
HOME = 1;
WORK = 2;
}
3.
syntax = "proto3"; //syntax = 「proto3」:表示這是使用protobuf3的語法,不加這句默認使用protobuf2的語言
import "google/protobuf/any.proto";
message Person {
string name = 1;
int32 id = 2;
string email = 3;
repeated google.protobuf.Any details = 5; // any任何類型
}
enum EnumAllowingAlias { option allow_alias = true; // 若是想讓不一樣的枚舉指向同一個field UNKNOWN = 0; STARTED = 1; RUNNING = 1;}