Protobuf 和接口的比较
本文比较了 Protobuf 和接口这两种 IDL 的区别,帮助 Dubbo 协议开发者了解 Protobuf,并为后续转向 Triple 协议和 Grpc 协议铺平道路。
1. 数据类型
1.1. 基本类型
ptoto 类型 | java 类型 |
---|---|
double | double |
float | float |
int32 | int |
int64 | long |
uint32 | int[注意] |
uint64 | long[注意] |
sint32 | int |
sint64 | long |
fixed32 | int[注意] |
fixed64 | long[注意] |
sfixed32 | int |
sfixed64 | long |
bool | boolean |
string | String |
bytes | ByteString |
[注意] 在 Java 中,无符号 32 位和 64 位整数使用其有符号对数表示,最高位仅存储在符号位中。
2. 复合类型
2.1. 枚举
- 原始 pb 代码
enum TrafficLightColor {
TRAFFIC_LIGHT_COLOR_INVALID = 0;
TRAFFIC_LIGHT_COLOR_UNSET = 1;
TRAFFIC_LIGHT_COLOR_GREEN = 2;
TRAFFIC_LIGHT_COLOR_YELLOW = 3;
TRAFFIC_LIGHT_COLOR_RED = 4;
}
- 生成的 java 代码
枚举是常量,因此使用大写
2.2. 数组
- 原始 pb 代码
message VipIDToRidReq {
repeated uint32 vipID = 1;
}
- 生成的 java 代码
底层实际上是一个 ArrayList
2.3. 集合
PB 不支持无序且不重复的集合,只能借用数组实现
,并且需要自行去重
。
2.4. 字典
- 原始 pb 代码
message BatchOnlineRes {
map<uint32, uint32> onlineMap = 1;//online status
}
- 生成的 java 代码
2.5. 嵌套
- 原始 pb 代码
message BatchAnchorInfoRes {
map<uint32, AnchorInfo> list = 1; //user information map list
}
/*
* The function of the corresponding interface: get user information in batches or individually
*/
message AnchorInfo {
uint32 ownerUid = 1 [json_name="uid"]; //user id
string nickName = 2 [json_name="nn"]; //User nickname
string smallAvatar = 3 [json_name="savt"]; //full path of user avatar - small
string middleAvatar = 4 [json_name="mavt"]; //Full path of user avatar - middle
string bigAvatar = 5 [json_name="bavt"]; //Full path of user avatar - big
string avatar = 6 [json_name="avt"]; //User avatar
}
- 生成的 java 代码
3. 字段默认值
- 对于字符串,默认为空字符串。
- 对于字节,默认为空字节。
- 对于布尔值,默认为 false。
- 对于数字类型,默认值为零。
- 对于枚举,默认值为第一个定义的枚举值,必须为 0。
- 对于消息字段,未设置该字段。其确切值取决于语言。有关详细信息,请参阅生成的代码指南。
4. 整体结构
特性 | Java 接口 | Protobuf | 备注 |
---|---|---|---|
方法重载 | √ | × | |
泛型/模板 | √ | × | |
方法继承 | √ | × | |
嵌套定义 | √ | 部分支持 | PB 仅支持消息和枚举嵌套 |
导入文件 | √ | √ | |
字段为空 | √ | × | |
多个输入参数 | √ | × | PB 仅支持单个输入参数 |
0 个输入参数 | √ | × | PB 必须有输入参数 |
0 个输出参数 | √ | × | PB 必须有输出参数 |
输入/输出参数是抽象类 | √ | × | PB 的输入/输出参数必须是具体类 |
输入/输出参数是接口 | √ | × | PB 的输入/输出参数必须是具体的 |
输入参数/输出参数是基本类型 | √ | × | PB 的输入参数/输出参数必须是结构 |
5. 社区概况
- 社区主页地址:https://developers.google.cn/protocol-buffers/
- 社区开源地址:https://github.com/google/protobuf
- 相关 jar 包的 Maven:https://search.maven.org/search?q=com.google.protobuf
上次修改时间:2023 年 1 月 2 日:增强英文文档 (#1798) (95a9f4f6c1c)