Protocol Buffers (Protobuf) 全面解析

在這里插入圖片描述

一、核心概念解析

1. 什么是數據序列化?

序列化
反序列化
程序對象
字節流
程序對象
  • 序列化:將數據結構或對象轉換為二進制/文本格式
  • 反序列化:將二進制/文本數據還原為數據結構

2. Protobuf 的定位

特性ProtobufJSONXML
數據格式二進制文本文本
大小? 非常小極大
速度? 非常快極慢
可讀性不可讀可讀可讀
類型安全? 強類型弱類型弱類型

二、核心工作原理

1. 定義數據結構(.proto 文件)

syntax = "proto3";message Person {int32 id = 1;              // 唯一IDstring name = 2;           // 姓名string email = 3;          // 郵箱repeated string phones = 4; // 電話列表enum PhoneType {MOBILE = 0;HOME = 1;WORK = 2;}message PhoneNumber {string number = 1;PhoneType type = 2;}repeated PhoneNumber phone_numbers = 5; // 結構化電話列表
}

2. Protobuf 編譯器工作流程

開發者 protoc 編譯器 目標語言 編寫 .proto 文件 生成語言特定代碼 如 Python/Java/C++類 在代碼中使用生成的類 開發者 protoc 編譯器 目標語言

3. 二進制編碼原理

Protobuf 使用 Tag-Length-Value (TLV) 編碼:

Tag
Length
Value
TLV
字段1
字段編號+數據類型
數據長度-可選
實際數據
字段2
...
  • Tag:字段唯一標識(1-5字節)
  • Value:實際數據(變長編碼)

三、核心優勢詳解

1. 極致性能

操作ProtobufJSON提升倍數
序列化時間0.15ms0.92ms6x
反序列化時間0.12ms0.87ms7x
數據大小28字節118字節4.2x

測試數據基于相同 Person 對象(來源:Google 基準測試)

2. 跨語言支持

Protobuf 官方支持語言:

    title 語言支持度“C++/Java/Python” : 45“Go/C#/Ruby” : 25“PHP/Node.js” : 15“Dart/Objective-C” : 10“其他” : 5

3. 版本兼容機制

message Person {int32 id = 1;     // 必填字段string name = 2;  // 必填字段// 新添加的字段(兼容舊版)string email = 3;  // 可選字段(新版本添加)// 已廢棄字段(仍可讀取舊數據)reserved 4;       // 保留字段編號reserved "old_field";
}
  • 向前兼容:新代碼讀取舊數據
  • 向后兼容:舊代碼讀取新數據

四、實際應用示例(Python)

1. 安裝 Protobuf

pip install protobuf

2. 使用生成的代碼

# 導入生成的類
import person_pb2# 創建對象
person = person_pb2.Person()
person.id = 123
person.name = "張三"
person.email = "zhangsan@example.com"
person.phones.append("13800138000")# 添加結構化電話
phone = person.phone_numbers.add()
phone.number = "13900139000"
phone.type = person_pb2.Person.PHONE_TYPE_MOBILE# 序列化為二進制
binary_data = person.SerializeToString()
print(f"序列化大小: {len(binary_data)} bytes")# 反序列化
new_person = person_pb2.Person()
new_person.ParseFromString(binary_data)print(f"反序列化姓名: {new_person.name}")
print(f"手機號: {new_person.phone_numbers[0].number}")

3. 輸出結果

序列化大小: 48 bytes
反序列化姓名: 張三
手機號: 13900139000

五、適用場景分析

1. 推薦使用場景

高性能網絡通信
微服務間通信
大數據存儲
高效持久化
跨語言數據交換
多語言系統集成
實時系統
低延遲要求

2. 不適用場景

  • 人類可讀的配置文件
  • 需要直接編輯的持久化數據
  • 簡單前端-后端通信(通常用JSON更合適)

六、與 gRPC 的關系

定義
定義
使用
Protobuf
服務接口
數據結構
gRPC
網絡通信
  • Protobuf 是 gRPC 的接口定義語言(IDL)數據序列化格式
  • gRPC 使用 Protobuf 定義服務和消息格式
  • 90% 的 gRPC 實現使用 Protobuf 作為默認序列化器

七、生態系統工具

1. 核心工具鏈

工具用途示例命令
protoc編譯器protoc --python_out=. person.proto
protobuf-runtime運行時庫Python: import google.protobuf
protoc-gen-goGo語言插件protoc --go_out=. person.proto

2. 高級工具

Protobuf
數據驗證
Linting
格式檢查
文檔生成

八、版本演進

Protobuf 版本對比

特性proto2proto3
語法required/optional所有字段可選
默認值可自定義零值(0, “”, false)
枚舉首字段需為0首字段必須為0
JSON 支持有限完整支持
新類型Any, Oneof, Map

最佳實踐:新項目應直接使用 proto3 語法

九、性能優化技巧

  1. 復用消息對象:避免頻繁創建新對象

    # 好:復用對象
    person = person_pb2.Person()
    for data in dataset:person.ParseFromString(data)process(person)person.Clear()# 差:頻繁創建新對象
    for data in dataset:person = person_pb2.Person()person.ParseFromString(data)process(person)
    
  2. 使用bytes代替string:當處理二進制數據時

    // 推薦
    bytes image_data = 4;// 不推薦
    string image_data = 4; // 會有額外編碼開銷
    
  3. 預分配重復字段

    # 預先分配空間
    person.phones.reserve(10)  # 預分配10個位置
    for phone in phone_numbers:person.phones.append(phone)
    

十、行業應用案例

  1. Google:幾乎所有內部RPC通信
  2. Kubernetes:ETCD存儲格式、API對象定義
  3. Netflix:微服務間通信
  4. Uber:地理位置數據傳輸
  5. Spotify:音樂元數據傳輸

根據2023年CNCF調查,82%的云原生項目使用Protobuf作為主要序列化格式

總結:Protobuf核心價值

title Protobuf 核心優勢“高性能” : 40“跨平臺” : 25“強類型” : 20“版本兼容” : 15

Protobuf 通過其高效的二進制編碼強大的跨語言支持優秀的版本兼容性,成為現代分布式系統和微服務架構的首選數據交換格式。雖然學習曲線較JSON更陡峭,但在性能敏感場景下帶來的收益遠超其學習成本。

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

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

相關文章

高斯混合模型GMMK均值(十三-1)——K均值是高斯混合模型的特例

EM算法與K均值算法的關系 K均值可以看成是高斯混合模型的特例。 對K均值算法與EM算法進行比較后,可以發現它們之間有很大的相似性。K均值算法將數據點硬(hard)分配到聚類中,每個數據點唯一地與一個聚類相關聯,而EM算法…

StarRocks 向量索引如何讓大模型“記性更好”?

隨著 ChatGPT、DeepSeek 等大語言模型的普及,我們已經能夠與 AI 進行流暢的對話。然而,即使是最先進的大模型也面臨著“記憶困境”,具體表現模型只能記住訓練時接觸的知識,且這些知識在使用時很可能會過期。實際應用或在處理特定領…

UniApp Vue3 模式下實現頁面跳轉的全面指南

1. 引言 1.1 UniApp 與 Vue3 的結合優勢 UniApp 是一個使用 Vue.js 開發所有前端應用的框架,支持編譯到 iOS、Android、H5、以及各種小程序平臺。Vue3 提供了更高效的響應式系統和 Composition API,使開發體驗更加現代化和靈活。 1.2 頁面跳轉在應用開發中的重要性 頁面跳…

Solidity學習 - ABI 應用二進制接口

文章目錄 一、ABI 基礎概念1. ABI 與 API 的區別2. ABI 的核心作用 二、ABI 接口描述1. 編譯后的產物2. ABI JSON 格式示例3. ABI JSON 關鍵字段說明 三、ABI 編碼1. 編碼示例2. 編碼數據的組成3. Solidity 中的編碼函數 四、ABI 解碼1. 解碼的基本概念2. 事件日志的解碼 五、A…

星際爭霸數據集指南

星際爭霸作為檢驗AI效果的一個重要“模式生物”, 是驗證AI技術的重要平臺?,尤其在 深度學習 和 強化學習領域。該游戲因其復雜的游戲機制和實時決策要求,為AI研究提供了豐富的測試環境和挑戰。 本博文是記錄自己曾經研究星際爭霸AI時對于數據部分的一點…

VUE組件與組件之間的傳參

每次啟動vue2項目的時候在 vue.config.js中配置: const { defineConfig } require(vue/cli-service) module.exports defineConfig({transpileDependencies: true,//關閉語法嚴格檢驗lintOnSave:false})1:在 src 下 創建 utils 文件夾 然后創建 Bas…

8年java開發從零學習人工智能(深度學習)--pp飛槳(百度自研開源框架)

1.明確概念:人工智能>機器學習>深度學習,三者的關系是包含關系,如圖所示: 人工智能(AI),很寬泛的概念,是研發用于模擬,延展和擴展人的智能的理論,方法&…

ci | cd

ci | cd 相當于開發人員和運維人員共同完成的東西 ci:Jenkins cd:k8s ci : 持續集成 開發人員寫出的代碼提交到共享倉庫 比如說Git 自動觸發代碼檢查 測試 好處: 很快的發現bug 代碼不用堆積 cd: 持續交付:代碼測試沒問題后 自動打包…

深入理解C#委托操作:添加、移除與調用全解析

關鍵詞:委托不可變性 多播委托 調用列表管理 ?? 一、委托的核心特性:不可變性 看似“添加”,實為新建 使用 為委托“添加”方法時(如 delVar SCl.m3;): 系統創建全新委托對象新委托的調用列表 原…

Spring Cloud:微服務架構的基石與實踐指南

一、Spring Cloud 核心組件 (一)Spring Cloud Netflix Spring Cloud Netflix 是 Spring Cloud 的核心模塊之一,它集成了 Netflix 的多個開源組件,提供了微服務架構中常見的功能,如服務注冊與發現、配置中心、API 網關…

【VPX3U】國產嵌入式平臺:RK3588J×JH930硬件架構與紅外應用方案

隨著對邊緣計算與多媒體處理需求的提升,國產異構平臺成為關鍵發展方向。最近有一個項目需求,提出了一款基于瑞芯微 RK3588J 處理器與景嘉微GPU 的 VPX3U 規格嵌入式主板的設計想法旨在融合高性能異構計算與豐富的視頻、網絡和存儲接口,適用于…

秩序密碼-用群論分析魔方的階

三階魔方的物理基礎是由一個三維十字軸連接的 6 個中心塊,這 6 個中心塊決定了魔方的 6 種顏色朝向,構成不動的坐標系統,此外還有兩類活動塊,分別是8個角塊,12個棱塊。 魔方的每一層轉動(如 R: 右層順時針…

Python驅動自動駕駛的“多眼”——打造高效傳感器融合框架的實戰思考

Python驅動自動駕駛的“多眼”——打造高效傳感器融合框架的實戰思考 最近,自動駕駛行業火得不行,背后支撐它的技術,遠不止車載攝像頭那么簡單。真正讓車“看懂”世界的,是多種傳感器數據的“融合”,包括雷達、激光雷達(LiDAR)、攝像頭、慣性測量單元(IMU)等等。 而如…

機器學習-- 聚類

什么是聚類? Clustering 可以簡單地說,對有標注的數據分類,就是邏輯回歸(屬于有監督分類),對無標注的數據分類,就是聚類(屬于無監督分類) 聚類是一種無監督學習技術&am…

【Yonghong 企業日常問題08 】永洪BI的Apache Tomcat版本升級指南

文章目錄 前言操作步驟登錄驗證 前言 某公司業務永洪BI系統使用tomcat 9.0.97版本,接到總公司漏洞掃描整改要求需要將tomcat版本升級到9.0.97以上。 目標:tomcat 9.0.97》 9.0.98 1、下載tomcat所需要的版本 地址:https://tomcat.apache.org/download-…

BigFoot RaidSlackCheck11.109.zip lua

BigFoot RaidSlackCheck11.109.zip lua 合劑buff檢查插件 把lua腳本拷貝到游戲插件目錄下: D:\Battle.net\World of Warcraft\_classic_\Interface\AddOns 命令 /rsc 下載地址: https://download.csdn.net/download/spencer_tseng/91181827

深入解析前端 Meta 標簽:HTML 的隱形守護者與功能大師

在構建現代網頁時&#xff0c;我們常常關注炫目的視覺效果、復雜的交互邏輯或強大的框架&#xff0c;卻容易忽略那些深藏于 <head> 之中、看似不起眼的 <meta> 標簽。這些標簽如同網頁的隱形守護者&#xff0c;無聲地承擔著定義文檔元數據、指導瀏覽器行為、優化搜…

青少年編程與數學 01-012 通用應用軟件簡介 11 應用商店

青少年編程與數學 01-012 通用應用軟件簡介 11 應用商店 一、什么是應用商店&#xff08;一&#xff09;應用商店的基本定義&#xff08;二&#xff09;應用商店的工作原理&#xff08;三&#xff09;應用商店的類型 二、應用商店的重要意義&#xff08;一&#xff09;為用戶提…

《紅黑樹實現》

引言&#xff1a; 上次我們學習了比二叉搜索樹更高效的平衡二叉搜索樹&#xff08;AVL樹&#xff09;&#xff0c;這次我們要學習的是另外一種對二叉搜索樹的優化后的紅黑樹。 一&#xff1a;紅黑樹概念&#xff1a; 紅黑樹是一棵二叉搜索樹&#xff0c;他的每個結點增加一個…

領域驅動設計(DDD)【23】之泛化:從概念到實踐

文章目錄 一 泛化基礎&#xff1a;理解DDD中的核心抽象機制1.1 什么是泛化&#xff1f;1.2 為什么泛化在DDD中重要&#xff1f;1.3 泛化與特化的雙向關系 二 DDD中泛化的實現形式2.0 實現形式概覽2.1 類繼承&#xff1a;最直接的泛化實現2.2 接口實現&#xff1a;更靈活的泛化方…