先介绍几个经常使用关键字:数组
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;}