codecamp
Protobuf与Interface对比

本文对比了Protobuf和Interface这2种IDL的差异,帮助Dubbo协议开发者了解Protobuf,为后续转到Triple协议和Grpc协议做铺垫。

Protobuf与Interface这2种IDL的差异

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位整数使用它们的有符号对数来表示,顶部位只存储在符号位中。

1.2. 复合类型

1.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

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

1.2.2. 数组

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

image

底层实际上是1个ArrayList

2.2.3. 集合

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

2.2.4. 字典

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

image

2.2.5. 嵌套

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

image

3. 字段默认值

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

4. 整体结构

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

5. 社区资料


Dubbo3 Kryo 和 FST 序列化
Dubbo3 3.x 升级与兼容性指南
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

介绍与示例

应用级服务发现

动态修改运行态配置项

参考手册

配置中心参考手册

元数据参考手册

API 参考手册

Kubernetes 生命周期对齐探针

在线运维命令参考手册

Telnet 命令参考手册

Maven 插件参考手册

性能优化

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }