Protobuf與Interface對比

2022-04-12 14:34 更新

本文對比了Protobuf和Interface這2種IDL的差異,幫助Dubbo協(xié)議開發(fā)者了解Protobuf,為后續(xù)轉(zhuǎn)到Triple協(xié)議和Grpc協(xié)議做鋪墊。

Protobuf與Interface這2種IDL的差異

1. 數(shù)據(jù)類型

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位整數(shù)使用它們的有符號對數(shù)來表示,頂部位只存儲在符號位中。

1.2. 復(fù)合類型

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. 數(shù)組

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

image

底層實際上是1個ArrayList

2.2.3. 集合

PB不支持無序、不重復(fù)的集合,只能 借用數(shù)組實現(xiàn),需要 自行去重。

2.2.4. 字典

  • 原始pb代碼
message BatchOnlineRes {
    map<uint32, uint32> onlineMap = 1;//在線狀態(tài)
}
  • 生成的java代碼

image

2.2.5. 嵌套

  • 原始pb代碼
message BatchAnchorInfoRes {
    map<uint32, AnchorInfo> list = 1; //用戶信息map列表
}
/*
* 對應(yīng)接口的功能: 批量或單個獲取用戶信息
*/
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. 字段默認(rèn)值

  • 對于字符串,默認(rèn)值為空字符串。
  • 對于字節(jié),默認(rèn)值為空字節(jié)。
  • 對于bools,默認(rèn)值為false。
  • 對于數(shù)字類型,默認(rèn)值為零。
  • 對于枚舉,默認(rèn)值為第一個定義的枚舉值,它必須為0。
  • 對于消息字段,未設(shè)置字段。 它的確切值是語言相關(guān)的。 有關(guān)詳細(xì)信息,請參閱生成的代碼指南。

4. 整體結(jié)構(gòu)

Feature Java Interface Protobuf 備注
方法重載 ×
泛型/模板化 ×
方法繼承 ×
嵌套定義 部分支持 PB僅支持message和enum嵌套
import文件
字段為null ×
多個入?yún)?/td> × PB僅支持單入?yún)?/td>
0個入?yún)?/td> × PB必須有入?yún)?/td>
0個出參 × PB必須有出參
入?yún)?出參為抽象類 × PB的入?yún)?出參必須為具象類
入?yún)?出參為接口 × PB的入?yún)?出參必須為具象類
入?yún)?出參為基礎(chǔ)類型 × PB的入?yún)?出參必須為結(jié)構(gòu)體

5. 社區(qū)資料


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號