Protobuf与Interface对比

本文对比了Protobuf和Interface这2种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代码
  1. enum TrafficLightColor {
  2. TRAFFIC_LIGHT_COLOR_INVALID = 0;
  3. TRAFFIC_LIGHT_COLOR_UNSET = 1;
  4. TRAFFIC_LIGHT_COLOR_GREEN = 2;
  5. TRAFFIC_LIGHT_COLOR_YELLOW = 3;
  6. TRAFFIC_LIGHT_COLOR_RED = 4;
  7. }
  • 生成的java代码

image

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

2.2. 数组

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

image

底层实际上是1个ArrayList

2.3. 集合

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

2.4. 字典

  • 原始pb代码
  1. message BatchOnlineRes {
  2. map<uint32, uint32> onlineMap = 1;//在线状态
  3. }
  • 生成的java代码

image

2.5. 嵌套

  • 原始pb代码
  1. message BatchAnchorInfoRes {
  2. map<uint32, AnchorInfo> list = 1; //用户信息map列表
  3. }
  4. /*
  5. * 对应接口的功能: 批量或单个获取用户信息
  6. */
  7. message AnchorInfo {
  8. uint32 ownerUid = 1 [json_name="uid"]; //用户id
  9. string nickName = 2 [json_name="nn"]; //用户昵称
  10. string smallAvatar = 3 [json_name="savt"]; //用户头像全路径-小
  11. string middleAvatar = 4 [json_name="mavt"]; //用户头像全路径-中
  12. string bigAvatar = 5 [json_name="bavt"]; //用户头像全路径-大
  13. string avatar = 6 [json_name="avt"]; //用户头像
  14. }
  • 生成的java代码

image

3. 字段默认值

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

4. 整体结构

FeatureJava InterfaceProtobuf备注
方法重载×
泛型/模板化×
方法继承×
嵌套定义部分支持PB仅支持message和enum嵌套
import文件
字段为null×
多个入参×PB仅支持单入参
0个入参×PB必须有入参
0个出参×PB必须有出参
入参/出参为抽象类×PB的入参/出参必须为具象类
入参/出参为接口×PB的入参/出参必须为具象类
入参/出参为基础类型×PB的入参/出参必须为结构体

5. 社区资料

最后修改 December 16, 2022: Fix check (#1736) (97972c1)