Protobuf 和接口的比较

本文比较了 Protobuf 和接口这两种 IDL 的区别,帮助 Dubbo 协议开发者了解 Protobuf,并为后续转向 Triple 协议和 Grpc 协议铺平道路。

1. 数据类型

1.1. 基本类型

ptoto 类型java 类型
doubledouble
floatfloat
int32int
int64long
uint32int[注意]
uint64long[注意]
sint32int
sint64long
fixed32int[注意]
fixed64long[注意]
sfixed32int
sfixed64long
boolboolean
stringString
bytesByteString

[注意] 在 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 代码

image

枚举是常量,因此使用大写

2.2. 数组

  • 原始 pb 代码
message VipIDToRidReq {
    repeated uint32 vipID = 1;
}
  • 生成的 java 代码

image

底层实际上是一个 ArrayList

2.3. 集合

PB 不支持无序且不重复的集合,只能借用数组实现,并且需要自行去重

2.4. 字典

  • 原始 pb 代码
message BatchOnlineRes {
    map<uint32, uint32> onlineMap = 1;//online status
}
  • 生成的 java 代码

image

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 代码

image

3. 字段默认值

  • 对于字符串,默认为空字符串。
  • 对于字节,默认为空字节。
  • 对于布尔值,默认为 false。
  • 对于数字类型,默认值为零。
  • 对于枚举,默认值为第一个定义的枚举值,必须为 0。
  • 对于消息字段,未设置该字段。其确切值取决于语言。有关详细信息,请参阅生成的代码指南。

4. 整体结构

特性Java 接口Protobuf备注
方法重载×
泛型/模板×
方法继承×
嵌套定义部分支持PB 仅支持消息和枚举嵌套
导入文件
字段为空×
多个输入参数×PB 仅支持单个输入参数
0 个输入参数×PB 必须有输入参数
0 个输出参数×PB 必须有输出参数
输入/输出参数是抽象类×PB 的输入/输出参数必须是具体类
输入/输出参数是接口×PB 的输入/输出参数必须是具体的
输入参数/输出参数是基本类型×PB 的输入参数/输出参数必须是结构

5. 社区概况


上次修改时间:2023 年 1 月 2 日:增强英文文档 (#1798) (95a9f4f6c1c)