protobuf语法
1: 目前最新的proto3协议, 很多也用proto2 syntax = "proto2"; syntax = "proto3";
2: 注释: 和C/C++一样 双斜杠 //
3: message定义一个消息类型:
message name {
// 字段规则 字段类型 字段名字 字段标识号
required string name = 1;
optional uint32 sex = 2;
repeated uint32 set = 3; // 存放 uint3类型的动态数组;
}
4: required: 表示该值是必须要设置的,一个格式良好的消息一定要含有1个这种字段。
5: optional: 可以不用设置, 如果不设置将不会被编码进去,当解 析消息时,如果它不包含optional的元素值,那么解析出来的对象中的对应字段就被置为默认值。
6: repeated:在一个格式良好的消息中,这种字段可以重复任意多次(包括0次)。重复的值的顺序会被保留。表示该值可以重复,相当于java中的List, c/c++ vector数组;
数据类型
1: 数据类型:double: 浮点数
float: 单精度浮点
int32: int类型,使用可变长编码,编码负数不够高效,如果有负数那么使用sint32
sint32: int类型,使用可变长编码, 有符号的整形,比通常的int32高效;
uint32: 无符号整数 使用可变长编码方式;
int64 long long , 使用可变长编码方式。编码负数时不够高效——如果有负数,可以使用sint64;
sint64 long long 使用可变长编码方式。有符号的整型值。编码时比通常的int64高效;
uint64: 无符号整数 使用可变长编码方式;
fixed32 : 总是4个字节。如果数值总是比总是比2^28大的话,这个类型会比uint32高效。
fixed64: 总是8个字节。如果数值总是比总是比2^56大的话,这个类型会比uint64高效。
sfixed32: 总是4个字节。
sfixed64: 总是8个字节。
bool: bool值
string: 一个字符串必须是UTF-8编码或者7-bit ASCII编码的文本。
bytes: 可能包含任意顺序的字节数据。类似java的ByteString以及 c++ string;
enum 包
1: 定义enumenum Direction {
EAST = 1;
SOUTH = 2;
WEST = 3;
NORTH = 4;
};
2: proto定义包
.proto文件新增一个可选的package声明符,用来防止不同的消息类型有命名冲突
包的声明符会根据使用语言的不同影响生成的代码。对于C++,产生的类会被包装在C++的命名空间中
package tutorial; //package声明符
mesage嵌套
1: message里面可以嵌套其它的message类型
message Person {}
message AddressBook
{
repeated Person people = 1;
}
proto3/proto2区别
1: 字段规则移除了 “required”,,“optional”
2: 语言增加 Go、Ruby、JavaNano 支持;
3: 移除了 default 选项, roto3 中,字段的默认值只能根据字段类型由系统决定
4: 枚举类型的第一个字段必须为 0
5: 其他我们不关心
移除了对分组的支持: 分组的功能完全可以用消息嵌套的方式来实现,并且更清晰。
移除了对扩展的支持,新增了 Any 类型
增加了 JSON 映射特性
----使用proto3
----使用proto2