关于protobuf 枚举未指定默认值的情况
2017-08-11 13:52
696 查看
语法规则
protobuf协议的文件后缀名为.proto。一个简单的protobuf协议如下:
message Person {
required string name = 1;
required int32 id = 2;
optional string email = 3;
enum PhoneType {
MOBILE = 0;
HOME = 1;
WORK = 2;
}
message PhoneNumber {
required string number = 1;
optional PhoneType type = 2 [default = HOME];
}
repeated PhoneNumber phone = 4;
}
message AddressBook {
repeated Person person = 1;
}
1、标识符
protobuf协议的标识符为message或enum,如示例中的Person和PhoneType。message标识一条消息,enum标识一个枚举类型。使用protobuf编译器将协议文件编译后,message和enum都会生成一个类。
2、字段
协议字段格式如下:
role type name = tag [default value];
role有三种取值:
required:表示该字段必须有值,不能为空,否则message被认为是未初始化的。如果试图build一个未初始化的message将会抛出RuntimeException。解析未初始化的message会抛出IOException。
optional:表示该段为可选值,可以不进行设置。如果不设置,会设置一个默认值。可以设置一个默认值,正如示例中的type字段。否则使用系统默认值,数字类型默认为0;字符串类型默认为空字符串;逻辑类型默认为false;内部自定义的message,默认值通常是message的实例或原型。
repeated:表示该字段可以重复,可等同于动态数组。
注意:使用required字段一定要小心,因为该字段是永久性的。如果以后因为某种原因,想不用该字段,或者要将该字段改成optional或者repeated,那么使用旧接口读取新的协议时,如果发现没有该字段,他们会认为该字段是不完整的,会拒接接收该消息,或者直接丢弃。
protobuf协议的文件后缀名为.proto。一个简单的protobuf协议如下:
message Person {
required string name = 1;
required int32 id = 2;
optional string email = 3;
enum PhoneType {
MOBILE = 0;
HOME = 1;
WORK = 2;
}
message PhoneNumber {
required string number = 1;
optional PhoneType type = 2 [default = HOME];
}
repeated PhoneNumber phone = 4;
}
message AddressBook {
repeated Person person = 1;
}
1、标识符
protobuf协议的标识符为message或enum,如示例中的Person和PhoneType。message标识一条消息,enum标识一个枚举类型。使用protobuf编译器将协议文件编译后,message和enum都会生成一个类。
2、字段
协议字段格式如下:
role type name = tag [default value];
role有三种取值:
required:表示该字段必须有值,不能为空,否则message被认为是未初始化的。如果试图build一个未初始化的message将会抛出RuntimeException。解析未初始化的message会抛出IOException。
optional:表示该段为可选值,可以不进行设置。如果不设置,会设置一个默认值。可以设置一个默认值,正如示例中的type字段。否则使用系统默认值,数字类型默认为0;字符串类型默认为空字符串;逻辑类型默认为false;内部自定义的message,默认值通常是message的实例或原型。
repeated:表示该字段可以重复,可等同于动态数组。
注意:使用required字段一定要小心,因为该字段是永久性的。如果以后因为某种原因,想不用该字段,或者要将该字段改成optional或者repeated,那么使用旧接口读取新的协议时,如果发现没有该字段,他们会认为该字段是不完整的,会拒接接收该消息,或者直接丢弃。
相关文章推荐
- 平台移植的各种情况 --- 关于 protobuf的编译、安装,以及开发
- 【protobuf】关于数字alloc边界的小技巧
- 关于创建SQL数据库脚本没有默认值的情况
- 关于ProtoBuf (转载)
- WebSocket中关于使用ProtoBuf传输数据介绍js部分
- 3.关于枚举类型使用默认值的问题
- 关于Protobuf For Windows下编译问题以及方法
- 关于protobuf的问题
- 关于“ORA-12154: TNS: 无法解析指定的连接标识符”的另一种可能情况
- 关于google的protobuf
- protobuf入门教程(五):枚举(enum)、包(package)
- 关于google的protobuf在vs的release版下编译出错的解决方案
- python protobuf在不确定消息类型的情况下解析消息
- ocos2dx-lua采用pbc解析protobuf 不支持message嵌套和枚举不支持整数的处理方法
- 关于google protobuf编译找不到不到google\protobuf\stubs\common.h头文件的问题
- 关于Google protobuf的总结
- c++ java中关于protobuf反序列化对象实体和实体处理(函数)关系 (一)
- c++ java中关于protobuf反序列化对象实体和实体处理(函数)关系(二)
- 关于protobuf javascript的版本
- Ubuntu下关于安装opencv3.x时一直downloading protobuf-cpp-3.1的问题