Protocol Buffers(Protobuf)功能及使用方法
Protocol Buffers(Protobuf) 是Google公司開(kāi)發(fā)的一種數(shù)據(jù)描述語(yǔ)言,類(lèi)似于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 開(kāi)發(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)的類(lèi)或結(jié)構(gòu)體定義。
- 序列化和反序列化方法。
- 其他輔助方法(如字段訪問(wèn)、初始化等)。
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),類(lèi)似于類(lèi)或結(jié)構(gòu)體。- 字段類(lèi)型:如
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:包含所有依賴(lài)的.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)容類(lè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 類(lèi),可以直接在 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)
# 訪問(wèn)反序列化后的數(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ì)象。- 字段訪問(wèn):通過(guò)
.操作符訪問(wèn)消息字段(如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。 - 枚舉類(lèi)型:定義枚舉字段。
- Oneof:指定一組字段中只能有一個(gè)字段被設(shè)置。
- Map:定義鍵值對(duì)字段。
- RPC 服務(wù):定義 gRPC 服務(wù)接口。
10. 總結(jié)
protoc 是 Protocol Buffers 的核心工具,用于將 .proto 文件編譯成目標(biāo)語(yǔ)言的代碼。它支持多種編程語(yǔ)言,生成的代碼高效且易于使用。通過(guò) Protocol Buffers,開(kāi)發(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)獲取磁盤(pán)剩余空間的2種方法
這篇文章主要介紹了Python實(shí)現(xiàn)獲取磁盤(pán)剩余空間的2種方法,結(jié)合具體實(shí)例形式分析了Python操作計(jì)算機(jī)硬件的相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-06-06
Python命令行參數(shù)argv和argparse該如何使用
這篇文章主要介紹了Python命令行參數(shù)argv和argparse該如何使用,幫助大家更好的理解和學(xué)習(xí)使用python,感興趣的朋友可以了解下2021-02-02
python實(shí)現(xiàn)定時(shí)提取實(shí)時(shí)日志程序
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)定時(shí)提取實(shí)時(shí)日志程序,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-06-06
Python內(nèi)置函數(shù)的用法實(shí)例教程
這篇文章主要介紹了Python內(nèi)置函數(shù)的用法,包括求絕對(duì)值的abs()函數(shù)及數(shù)值類(lèi)型轉(zhuǎn)換函數(shù)等,需要的朋友可以參考下2014-09-09
media配置及把用戶(hù)頭像從數(shù)據(jù)庫(kù)展示到前端的操作方法
media配置可以讓用戶(hù)上傳的所有文件都固定的存放在某一個(gè)指定的文件夾下,接下來(lái)通過(guò)本文給大家介紹下media配置及把用戶(hù)頭像從數(shù)據(jù)庫(kù)展示到前端的操作,需要的朋友可以參考下2022-09-09
詳解HttpRunner3的HTTP請(qǐng)是如何發(fā)出
這篇文章主要為大家介紹了HttpRunner3的HTTP請(qǐng)是如何發(fā)出詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07

