Protobuf3協議關鍵字詳解與應用實例

一、核心語法與基礎關鍵字

  1. syntax
    聲明協議版本,必須為文件的第一行非空、非注釋內容。

    syntax = "proto3";  // 顯式指定proto3語法,否則編譯器默認使用proto2
    
  2. message
    定義消息類型,包含一組結構化字段。支持嵌套消息定義,用于復雜數據結構。

    message User {string name = 1;int32 age = 2;
    }
    
  3. 字段標識號(Tag)
    每個字段的唯一編號(1~536,870,911),用于二進制編碼標識。

    • 優化建議:高頻字段使用1~15以節省編碼空間;

    • 保留范圍:19000~19999為協議保留,禁止使用。


二、字段規則與類型關鍵字

  1. 字段規則

    • singular(默認):單值字段,可缺省(默認值生效);

    • repeated:數組類型,支持動態長度(如repeated int32 scores = 3;);

    • optional(proto2特有):proto3中已棄用,默認支持缺省。

  2. 數據類型

    • 標量類型:int32stringbool等,支持跨語言映射(如Java的int對應int32);

    • 復合類型:

      • enum:枚舉類型,需定義零值(如enum Gender { UNKNOWN = 0; MALE = 1; });

      • map:鍵值對(如map<string, int32> attributes = 4;)。

  3. reserved
    保留字段標識號或名稱,防止舊版本字段被誤用:

    message Foo {reserved 2, 15 to 20;  // 保留標識號reserved "old_field";   // 保留字段名
    }
    

三、高級特性與擴展關鍵字

  1. servicerpc
    定義gRPC服務接口,需配合message類型聲明請求/響應體:

    service UserService {rpc GetUser (UserRequest) returns (UserResponse);
    }
    
  2. oneof
    實現多態字段,同一時間僅允許設置一個字段值:

    message Account {oneof auth {string password = 1;bytes token = 2;}
    }
    
  3. import
    導入其他proto文件,支持模塊化設計:

    import "google/protobuf/empty.proto";  // 引入空對象定義
    
  4. 默認值規則
    未賦值字段自動賦予默認值(如string默認為空串,int32默認為0),需注意與業務邏輯的兼容性。


四、應用實例

場景:用戶管理系統(Java實現)

  1. 定義Proto文件

    syntax = "proto3";
    option java_package = "com.example.model";
    message User {int32 id = 1;string name = 2;repeated string roles = 3;  // 用戶角色列表
    }
    
  2. 生成Java代碼
    使用protoc編譯器生成POJO類:

    protoc --java_out=./src/main/java user.proto
    
  3. 序列化與反序列化

    // 序列化
    User user = User.newBuilder().setId(1001).setName("Alice").build();
    byte[] data = user.toByteArray();// 反序列化
    User parsedUser = User.parseFrom(data);
    System.out.println(parsedUser.getName());  // 輸出:"Alice"
    
  4. gRPC服務端實現

    public class UserServiceImpl extends UserServiceGrpc.UserServiceImplBase {@Overridepublic void getUser(UserRequest request, StreamObserver<UserResponse> responseObserver) {UserResponse response = UserResponse.newBuilder().setUser(User.newBuilder().setId(request.getId()).build()).build();responseObserver.onNext(response);responseObserver.onCompleted();}
    }
    

五、Protobuf3與Protobuf2協議關鍵字對比

Protobuf3與Protobuf2協議關鍵字對比

1、核心語法差異
  1. 語法聲明

    • Proto3:文件首行必須顯式聲明 syntax = "proto3";,否則編譯器會報錯。

    • Proto2:無需顯式聲明語法版本,默認支持proto2。

  2. 字段規則調整

    • Proto3:移除了 required 關鍵字,optional 更名為 singular(默認規則)。所有字段默認允許為空(相當于proto2的optional)。

    • Proto2:支持 required(不推薦)、optionalrepeated,其中 required 要求字段必須賦值。

  3. 默認值約定

    • Proto3:不允許顯式指定默認值,系統自動根據類型分配默認值(如 string 默認為空串,int32 為0,bool 為false)。

    • Proto2:可通過 default 關鍵字自定義默認值(如 optional int32 id = 1 [default = 100];)。

2、數據類型與編碼優化
  1. 枚舉類型約束

    • Proto3:枚舉的第一個值必須為0,且默認值強制為0,無法修改。

    • Proto2:枚舉首個值可為任意數值,默認值為第一個定義的值。

  2. 重復字段編碼

    • Proto3:repeated 標量數值類型(如 int32float)默認啟用 packed 編碼,減少序列化體積。

    • Proto2:需顯式聲明 [packed=true] 才能啟用緊湊編碼。

  3. 新增與移除類型

    • Proto3:

      • 原生支持 map 類型(如 map<string, int32>);

      • 移除 groups 語法,改用嵌套 message 實現類似功能;

      • 引入 Any 類型替代 extensions,提供更靈活的泛型支持。

    • Proto2:支持 extensions 擴展字段,groups 語法已棄用。

3、兼容性與擴展性
  1. 未知字段處理

    • Proto3(v3.5前):丟棄未知字段,可能導致數據丟失。

    • Proto3(v3.5+):保留未知字段,行為與Proto2一致。

    • Proto2:始終保留未知字段。

  2. JSON序列化支持

    • Proto3:內置JSON映射功能,支持與JSON雙向轉換。

    • Proto2:無原生JSON支持,需第三方庫實現。

4、最佳實踐與注意事項
  1. 版本升級建議

    • 新項目優先Proto3:簡化語法、增強兼容性,適合現代分布式系統。

    • 舊項目謹慎升級:Proto2代碼若依賴 required 或自定義默認值,需重構邏輯。

  2. 性能優化技巧

    • Proto3:高頻字段使用1-15的Tag編號以減少編碼體積;

    • 避免在循環中頻繁創建臨時消息對象,復用緩沖區降低GC壓力。


總結對比表
特性Proto3Proto2
語法聲明必須顯式聲明 syntax="proto3"無需聲明
字段規則僅支持 singular(默認)和 repeated支持 requiredoptionalrepeated
默認值系統自動分配,不可自定義支持 default 關鍵字指定
枚舉默認值強制首項為0首項可任意定義
重復字段編碼默認啟用 packed需顯式啟用 packed=true
擴展機制使用 Any 類型使用 extensions
JSON支持原生支持需第三方庫

通過上述對比可見,Proto3通過弱化語法約束、強化約定提升了開發效率,同時通過編碼優化(如默認packed)提升了性能。建議新項目直接采用Proto3,充分利用其現代化特性。


六、注意事項與最佳實踐

  1. 版本兼容性

    • 新增字段時避免修改已有標識號;

    • 使用reserved標記廢棄字段,防止數據沖突。

  2. 性能優化

    • 高頻字段優先使用1~15標識號;

    • repeated數值類型啟用packed編碼(proto3默認支持)。

  3. 工具鏈配合

    • 通過option optimize_for = SPEED;優化生成代碼性能;

    • 結合protobuf-maven-plugin自動化編譯流程。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/79958.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/79958.shtml
英文地址,請注明出處:http://en.pswp.cn/web/79958.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

如何在線免費壓縮PDF文檔?

PDF文件太大&#xff0c;通常是因為內部嵌入字體和圖片。怎么才能將文件大小減減肥呢&#xff0c;主要有降低圖片清晰度和去除相關字體兩個方向來實現文檔效果。接下來介紹三個免費壓縮PDF實用工具。 &#xff08;一&#xff09;iLoveOFD在線轉換工具 iLoveOFD在線轉換工具&a…

NSSCTF [GFCTF 2021]where_is_shell

889.[GFCTF 2021]where_is_shell(system($0)64位) [GFCTF 2021]where_is_shell (1) 1.準備 motalymotaly-VMware-Virtual-Platform:~$ file shell shell: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.s…

深度學習中的提示詞優化:梯度下降全解析

深度學習中的提示詞優化:梯度下降全解析 在您的代碼中,提示詞的更新方向是通過梯度下降算法確定的,這是深度學習中最基本的優化方法。 一、梯度下降與更新方向 1. 核心公式 對于可訓練參數 θ \theta θ(這里是提示詞嵌入向量),梯度下降的更新公式為:

win10電腦無法訪問局域網內其他共享電腦文件的問題

一、啟用本地計算機guest來賓賬戶 操作步驟 點擊桌面上的“此電腦”圖標&#xff0c;再點擊“管理” 在“計算機管理”界面依次點擊“系統工具”“本地用戶和組”“用戶” 再點擊右側的“Guest”&#xff0c;在彈出的對話框中點擊“屬性” 在“Guest屬性”界面取消勾選“賬戶已…

會計要素+借貸分錄+會計科目+賬戶,幾個銀行會計的重要概念

1.借貸分錄還是借貸分路 正確表述是“借貸分錄”。 “分錄”即會計分錄&#xff0c;它是指預先確定每筆經濟業務所涉及的賬戶名稱&#xff0c;以及計入賬戶的方向和金額的一種記錄&#xff0c;簡稱分錄。 在借貸記賬法下&#xff0c;會計分錄通過“借”和“貸”來表示記賬方向…

AI日報 · 2025年5月15日|GPT-4.1 登陸 ChatGPT

AI日報 2025年5月15日&#xff5c;GPT-4.1 登陸 ChatGPT 1、OpenAI 在 ChatGPT 全面開放 GPT-4.1 與 GPT-4.1 mini 北京時間 5 月 14 日晚&#xff0c;OpenAI 在官方 Release Notes 中宣布&#xff1a;專為復雜代碼與精細指令場景打造的 GPT-4.1 正式加入 ChatGPT&#xff0…

π0: A Vision-Language-Action Flow Model for General Robot Control

TL;DR 2024 年 Physical Intelligence 發布的 VLA 模型 π0&#xff0c;基于 transformer 流匹配&#xff08;flow matching&#xff09;架構&#xff0c;當前開源領域最強的 VLA 模型之一。 Paper name π0: A Vision-Language-Action Flow Model for General Robot Contr…

Java詳解LeetCode 熱題 100(17):LeetCode 41. 缺失的第一個正數(First Missing Positive)詳解

文章目錄 1. 題目描述2. 理解題目3. 解法一&#xff1a;排序法&#xff08;不滿足題目要求&#xff09;3.1 思路3.2 Java代碼實現3.3 代碼詳解3.4 復雜度分析3.5 不足之處 4. 解法二&#xff1a;哈希表法4.1 思路4.2 Java代碼實現4.3 代碼詳解4.4 復雜度分析4.5 不足之處 5. 解…

第九講 | 模板進階

模板進階 一、非類型模板參數1、模板參數的分類2、應用場景3、array4、注意 二、模板的特化1、概念2、函數模板特化3、類模板特化&#xff08;1&#xff09;、全特化&#xff1a;全部模板參數都特化成具體的類型&#xff08;2&#xff09;、偏/半特化&#xff1a;部分模板參數特…

機器學習——樸素貝葉斯練習題

一、 使用鳶尾花數據訓練多項式樸素貝葉斯模型&#xff0c;并評估模型 代碼展示&#xff1a; from sklearn.datasets import load_iris from sklearn.metrics import accuracy_score from sklearn.model_selection import train_test_split from sklearn.naive_bayes impor…

氣胸復查重點提問清單 ,怎樣平衡檢查必要性和輻射影響?

氣胸復查重點提問清單&#xff08;打印版&#xff09; 以下是帶孩子復查氣胸時建議與醫生溝通的重點問題&#xff0c;分為不同方面&#xff0c;可打印后隨身攜帶&#xff0c;逐項確認。 術后康復情況相關 1. 肺目前復張情況如何&#xff1f;胸片顯示肺是否已經完全展開&…

Linux相關概念和易錯知識點(40)(HTML資源交互、網頁管理、搜索引擎)

目錄 1.HTML資源交互 &#xff08;1&#xff09;媒體加載 &#xff08;2&#xff09;靜態頁面跳轉 &#xff08;3&#xff09;動態頁面 &#xff08;4&#xff09;GET和POST傳參的區別 2.網頁管理 &#xff08;1&#xff09;網頁的權限管理 &#xff08;2&#xff09;臨…

使用 QGIS 插件 OpenTopography DEM Downloader 下載高程數據(申請key教程)

使用 QGIS 插件 OpenTopography DEM Downloader 下載高程數據 目錄 使用 QGIS 插件 OpenTopography DEM Downloader 下載高程數據&#x1f4cc; 簡介&#x1f6e0; 插件安裝方法&#x1f30d; 下載 DEM 數據步驟&#x1f511; 注冊 OpenTopography 賬號&#xff08;如使用 Cope…

【通知】2025元宇宙數字人設計大賽啟動,大賽線上報名階段開啟!

元宇宙數字人設計大賽火熱報名中&#xff01;歡迎大家踴躍報名參與&#xff01; 元宇宙數字人設計大賽報名活動正在如火如荼進行中&#xff0c;歡迎各位對元宇宙數字人感興趣的同學與老師踴躍參與報名&#xff01; 元宇宙數字人設計大賽承接原大中華區VR盟主選拔賽&#xff0c…

Kaamel隱私合規洞察:Temu在韓被罰事件分析

Kaamel隱私合規與數據安全團隊分析報告 韓國個人信息保護委員會&#xff08;PIPC&#xff09;對中國電子商務巨頭Temu處以巨額罰款&#xff0c;原因是其嚴重違反了用戶數據保護法律 。核心違規行為包括未經適當披露或用戶同意非法跨境傳輸數據、未能指定當地代表、賬戶注銷流程…

查詢公網IP地址的方法:查看自己是不是公網ip,附內網穿透外網域名訪問方案

本地搭建服務并提供互聯網連接時&#xff0c;較為傳統的方法是使用公網IP地址。因此&#xff0c;如何查詢本地自己是不是公網IP&#xff0c;是必須要掌握的一種技巧。當面對確實無公網IP時&#xff0c;則可以通過內網穿透方案&#xff0c;如nat123網絡映射工具&#xff0c;將本…

Redis特性與應用

1、分布式緩存與redis 2、redis數據結構和客戶端集成 3、緩存讀寫模式與數據一致性 本地緩存&#xff1a;Hash Map、Ehcache、Caffeine、Google Guava 分布式緩存&#xff1a;Memcached、redis、Hazelcast、Apache ignite redis&#xff1a;基于鍵值對內存數據庫&#xff0c;支…

Top-p采樣:解鎖語言模型的創意之門

Top - p采樣 是什么&#xff1a;核采樣&#xff1a;排序&#xff0c;累計到0.7&#xff0c;隨機選擇 在自然語言生成和大規模語言模型推理中&#xff0c;Top - p采樣&#xff08;又叫核采樣&#xff0c;Nucleus Sampling&#xff09;是一種基于累積概率的采樣策略。 Top - p介…

Gitee DevSecOps:軍工軟件研發的智能化變革引擎

在數字化戰爭時代背景下&#xff0c;軍工軟件的研發效率與質量直接關乎國防建設進程。傳統軍工軟件開發面臨依賴管理混亂、版本變更失控、團隊協作低效等系統性難題&#xff0c;嚴重制約著"軟件工廠"理念的落地。Gitee DevSecOps平臺以智能版本管理為突破口&#xff…

芋道項目,商城模塊數據表結構

一、需求 最近公司有新的業務需求&#xff0c;調研了一下&#xff0c;決定使用芋道&#xff08;yudao-cloud&#xff09;框架,于是從github&#xff08;https://github.com/YunaiV/yudao-cloud&#xff09;上克隆項目&#xff0c;選用的是jdk17版本的。根據項目啟動手冊&#…