协议类型
syntax = "proto2"; 这个分号容易掉
注释写法
//注释
数据结构
message StructName{ //这个大括号在这里在VS中会有语法高亮**
//字段规则 字段类型 字段名 字段标识号
required string name = 1; //每次分号结尾
repeated int32 array_value = 2; //定义了一个动态数组,元素类型时int32
}
字段规则
required
标识该值是必须要设置的,一个格式良好的消息,一定要包含至少一个这种字段
optional
可以不用设置,如果不设置就不会编码进去,解析时没有的话使用默认值
repeated
在一个格式良好的消息中,这种字段可以重复任意多次(包括0次)。重复的值的顺序会被保留。表示该值可以重复,相当于java中的List,C++中的vector
数据类型
double
浮点数
float
单精度浮点数
int32
int类型,使用可变长编码,编码负数不够高效,有负数,推荐使用sint32
sint32
可变长编码 有符号整性 比通常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;
定义枚举
直接在proto文件中:
enum EnumName{
EnumValue = 1;
}
EnumName类型可以在类型定义时使用
required EnumName type = 1;
Message的嵌套
message M1{
}
message M2{
required M1 m = 1;
}
package_避免命名冲突
package myPackage;
proto2与proto3区别
- 字段规则移除“required",”optional“改为”singular"
- 增加Go,Ruby,JavaNano支持
- 移除default选项,字段默认值根据类型由系统决定
- 枚举类型第一个字段必须为0
- 其他,略