先上重点:
在proto3枚举值第一个必须是0,其他的随意
在proto2,每个属性前必须加required,optional,repeated
该数字只要不重复,可以定义为任何数字,不需要总是从1或者0开始
这个数字表示在序列化数组里面的顺序
然后是proto跟java类型对比图
最后是一段proto代码:
message LogonReqMessage {
required int64 acctID = 1;
required string passwd = 2
}
syntax = "proto3";
enum Sex
{
MALE = 0;
FEMALE = 1;
}
message Student
{
int32 number = 1;
string name = 2;
Sex sex = 3;
string hobby = 4;
string skill = 5;
repeated int32 array = 6 [packed=true];
}
这里将给出以上消息定义的关键性说明。
1. message是消息定义的关键字,等同于C++中的struct/class,或是Java中的class。
2. LogonReqMessage为消息的名字,等同于结构体名或类名。
3. required前缀表示该字段为必要字段,既在序列化和反序列化之前该字段必须已经被赋值。与此同时,在Protocol Buffer中还存在另外两个类似的关键字,optional和repeated,
带有这两种限定符的消息字段则没有required字段这样的限制。相比于optional,repeated主要用于表示数组字段。具体的使用方式在后面的用例中均会一一列出。
4. int64和string分别表示长整型和字符串型的消息字段,在Protocol Buffer中存在一张类型对照表,即Protocol Buffer中的数据类型与其他编程语言(C++/Java)中所用类型的对照。
该对照表中还将给出在不同的数据场景下,哪种类型更为高效。该对照表将在后面给出。
5. acctID和passwd分别表示消息字段名,等同于Java中的域变量名,或是C++中的成员变量名。
6. 标签数字1和2则表示不同的字段在序列化后的二进制数据中的布局位置。在该例中,passwd字段编码后的数据一定位于acctID之后。需要注意的是该值在同一message中不能重复。
另外,对于Protocol Buffer而言,标签值为1到15的字段在编码时可以得到优化,即标签值和类型信息仅占有一个byte,标签范围是16到2047的将占有两个bytes,
而Protocol Buffer可以支持的字段数量则为2的29次方减一。有鉴于此,我们在设计消息结构时,可以尽可能考虑让repeated类型的字段标签位于1到15之间,这样便可以有效的节省编码后的字节数量。
在proto3枚举值第一个必须是0,其他的随意
在proto2,每个属性前必须加required,optional,repeated
该数字只要不重复,可以定义为任何数字,不需要总是从1或者0开始
这个数字表示在序列化数组里面的顺序
7.repeated int32 array = 6 [packed=true];优化之前的版本对一些int32数据进行字节对齐。// 如果该选项在一个整型基本类型上被设置为真,则采用更紧凑的编码方式(不会对数值造成损失)
// 在2.3.0版本前,解析器将会忽略 非期望的包装值。因此,它不可能在 不破坏现有框架的兼容性上 而 改变压缩格式。
// 在2.3.0之后,这种改变将是安全的,解析器能够接受上述两种格式。
optional int32 old_field = 6 [deprecated=true];
// 作用:判断该字段是否已经被弃用
// 作用同 在java中的注解@Deprecated
-----------------------------------