Protocol Buffers(Protobuf)功能及使用方法
Protocol Buffers(Protobuf) 是Google公司開發(fā)的一種數(shù)據(jù)描述語(yǔ)言,類似于XML能夠?qū)⒔Y(jié)構(gòu)化數(shù)據(jù)序列化,可用于數(shù)據(jù)存儲(chǔ)、通信協(xié)議等方面。protoc
是 Protocol Buffers(Protobuf) 的編譯器,用于將 .proto
文件中定義的數(shù)據(jù)結(jié)構(gòu)編譯成目標(biāo)編程語(yǔ)言的代碼。Protocol Buffers 是 Google 開發(fā)的一種高效、跨語(yǔ)言的數(shù)據(jù)序列化格式,廣泛用于通信協(xié)議、數(shù)據(jù)存儲(chǔ)等領(lǐng)域。protoc
是使用 Protobuf 的核心工具。
1. Protocol Buffers 簡(jiǎn)介
Protocol Buffers 是一種二進(jìn)制序列化格式,具有以下特點(diǎn):
- 高效:比 XML 和 JSON 更小、更快。
- 跨語(yǔ)言:支持多種編程語(yǔ)言(如 C++, Java, Python, Go 等)。
- 可擴(kuò)展:支持向后和向前兼容的字段更新。
- 結(jié)構(gòu)化:通過(guò)
.proto
文件定義數(shù)據(jù)結(jié)構(gòu)。
2. protoc 的功能
protoc
的主要功能是將 .proto
文件編譯成目標(biāo)語(yǔ)言的代碼,生成的代碼包括:
- 數(shù)據(jù)結(jié)構(gòu)的類或結(jié)構(gòu)體定義。
- 序列化和反序列化方法。
- 其他輔助方法(如字段訪問、初始化等)。
3. .proto 文件
.proto
文件是 Protocol Buffers 的核心,用于定義數(shù)據(jù)結(jié)構(gòu)和消息格式。以下是一個(gè)簡(jiǎn)單的 .proto
文件示例:
syntax = "proto3"; // 使用 proto3 語(yǔ)法 message Person { string name = 1; // 字段編號(hào)必須唯一 int32 id = 2; string email = 3; }
syntax
:指定使用的 Protobuf 語(yǔ)法版本(proto2
或proto3
)。message
:定義數(shù)據(jù)結(jié)構(gòu),類似于類或結(jié)構(gòu)體。- 字段類型:如
string
、int32
、bool
等。 - 字段編號(hào):每個(gè)字段的唯一標(biāo)識(shí)符,用于二進(jìn)制編碼。
4. 使用 protoc 編譯 .proto 文件
protoc
的基本命令格式如下:
protoc --<language>_out=<output_dir> <proto_file>
--<language>_out
:指定目標(biāo)語(yǔ)言和輸出目錄。例如:--cpp_out
生成 C++ 代碼。--java_out
生成 Java 代碼。--python_out
生成 Python 代碼。<output_dir>
:生成的代碼的輸出目錄。<proto_file>
:輸入的.proto
文件。
示例
假設(shè)有一個(gè) example.proto
文件,生成 Python 代碼:
protoc --python_out=. example.proto
這將生成 example_pb2.py
文件,供 Python 項(xiàng)目使用。
5. 支持的編程語(yǔ)言
protoc
支持多種編程語(yǔ)言,包括但不限于:
- C++
- Java
- Python
- Go
- JavaScript
- Ruby
- C#
- PHP
- Dart
- Kotlin
每種語(yǔ)言需要安裝對(duì)應(yīng)的 Protobuf 運(yùn)行時(shí)庫(kù)。
6. 安裝protoc
在 Linux 上安裝
使用包管理器安裝:
sudo apt-get install protobuf-compiler # Ubuntu/Debian sudo yum install protobuf-compiler # CentOS/RHEL
在 macOS 上安裝
使用 Homebrew 安裝:
brew install protobuf
在 Windows 上安裝
- 從 Protobuf 官方 GitHub 發(fā)布頁(yè)面 下載預(yù)編譯的
protoc
二進(jìn)制文件。 - 解壓并將
protoc
添加到系統(tǒng)環(huán)境變量中。
7. 常用命令選項(xiàng)
--cpp_out
:生成 C++ 代碼。--java_out
:生成 Java 代碼。--python_out
:生成 Python 代碼。--go_out
:生成 Go 代碼。--include_imports
:包含所有依賴的.proto
文件。--proto_path
:指定.proto
文件的搜索路徑。
8. 示例:完整使用流程
步驟 1:定義 .proto
文件
創(chuàng)建 person.proto
文件:
syntax = "proto3"; message Person { string name = 1; int32 id = 2; string email = 3; }
步驟 2:編譯 .proto
文件
生成 Python 代碼:
protoc --python_out=. person.proto
執(zhí)行 protoc --python_out=. person.proto
后,會(huì)生成 person_pb2.py
文件,內(nèi)容類似于:
# Generated by the protocol buffer compiler. DO NOT EDIT! # source: person.proto import sys _b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1')) from google.protobuf import descriptor as _descriptor from google.protobuf import message as _message from google.protobuf import reflection as _reflection from google.protobuf import symbol_database as _symbol_database # @@protoc_insertion_point(imports) _sym_db = _symbol_database.Default() class Person(_message.Message): __slots__ = ['name', 'id', 'email'] NAME_FIELD_NUMBER = 1 ID_FIELD_NUMBER = 2 EMAIL_FIELD_NUMBER = 3 ...
步驟 3:在 Python 中使用生成的代碼
生成的 person_pb2.py
文件包含一個(gè) Person
類,可以直接在 Python 代碼中使用。
import person_pb2 # 導(dǎo)入生成的模塊 # 創(chuàng)建一個(gè) Person 對(duì)象 person = person_pb2.Person() person.name = "John Doe" person.id = 1234 person.email = "johndoe@example.com" # 序列化(將對(duì)象轉(zhuǎn)換為二進(jìn)制數(shù)據(jù)) serialized_data = person.SerializeToString() print("Serialized data:", serialized_data) # 反序列化(將二進(jìn)制數(shù)據(jù)轉(zhuǎn)換為對(duì)象) new_person = person_pb2.Person() new_person.ParseFromString(serialized_data) # 訪問反序列化后的數(shù)據(jù) print("Name:", new_person.name) print("ID:", new_person.id) print("Email:", new_person.email)
SerializeToString()
:將消息對(duì)象序列化為二進(jìn)制字符串。ParseFromString(data)
:將二進(jìn)制字符串反序列化為消息對(duì)象。- 字段訪問:通過(guò)
.
操作符訪問消息字段(如person.name
)。
運(yùn)行結(jié)果
Serialized data: b'\n\x08John Doe\x10\xd2\t\x1a\x10johndoe@example.com'
Name: John Doe
ID: 1234
Email: johndoe@example.com
9. 高級(jí)功能
- 嵌套消息:在
message
中定義嵌套的message
。 - 枚舉類型:定義枚舉字段。
- Oneof:指定一組字段中只能有一個(gè)字段被設(shè)置。
- Map:定義鍵值對(duì)字段。
- RPC 服務(wù):定義 gRPC 服務(wù)接口。
10. 總結(jié)
protoc
是 Protocol Buffers 的核心工具,用于將 .proto
文件編譯成目標(biāo)語(yǔ)言的代碼。它支持多種編程語(yǔ)言,生成的代碼高效且易于使用。通過(guò) Protocol Buffers,開發(fā)者可以輕松實(shí)現(xiàn)跨語(yǔ)言的數(shù)據(jù)序列化和通信。
到此這篇關(guān)于Protocol Buffers(Protobuf)簡(jiǎn)介的文章就介紹到這了,更多相關(guān)Protocol Buffers Protobuf 簡(jiǎn)介內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python實(shí)現(xiàn)獲取磁盤剩余空間的2種方法
這篇文章主要介紹了Python實(shí)現(xiàn)獲取磁盤剩余空間的2種方法,結(jié)合具體實(shí)例形式分析了Python操作計(jì)算機(jī)硬件的相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-06-06Python命令行參數(shù)argv和argparse該如何使用
這篇文章主要介紹了Python命令行參數(shù)argv和argparse該如何使用,幫助大家更好的理解和學(xué)習(xí)使用python,感興趣的朋友可以了解下2021-02-02python實(shí)現(xiàn)定時(shí)提取實(shí)時(shí)日志程序
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)定時(shí)提取實(shí)時(shí)日志程序,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-06-06Python內(nèi)置函數(shù)的用法實(shí)例教程
這篇文章主要介紹了Python內(nèi)置函數(shù)的用法,包括求絕對(duì)值的abs()函數(shù)及數(shù)值類型轉(zhuǎn)換函數(shù)等,需要的朋友可以參考下2014-09-09media配置及把用戶頭像從數(shù)據(jù)庫(kù)展示到前端的操作方法
media配置可以讓用戶上傳的所有文件都固定的存放在某一個(gè)指定的文件夾下,接下來(lái)通過(guò)本文給大家介紹下media配置及把用戶頭像從數(shù)據(jù)庫(kù)展示到前端的操作,需要的朋友可以參考下2022-09-09詳解HttpRunner3的HTTP請(qǐng)是如何發(fā)出
這篇文章主要為大家介紹了HttpRunner3的HTTP請(qǐng)是如何發(fā)出詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07