概念
Protobuf(Google Protocol Buffers)是google開發的的一套用于數據存儲,網絡通信時用于協議編解碼的工具庫.它和XML和Json數據差不多,把數據已某種形式保存起來.Protobuf相對與XML和Json的不同之處,它是一種二進制的數據格式,具有更高的傳輸,打包和解包效率
優點:
1:序列化后體積相比Json和XML很小,適合網絡傳輸
2:支持跨平臺多語言
3:消息格式升級和兼容性還不錯
4:序列化反序列化速度很快,快于Json的處理速度
缺點:
1、以二進制的方式存儲,除非你有 .proto 定義,否則你沒法直接讀出 Protobuf 的任何內容。
2、功能簡單,無法用來表示復雜的概念。
標準數據類型
一個標量消息字段可以含有一個如下的類型——該表格展示了定義于.proto文件中的類型,以及與之對應的、在自動生成的訪問類中定義的類型

基于序號的協議字段映射(類似key-value結構)
新建 test.proto
在消息中承載的數據分別對應于每一個字段都有一個名字和一種類型。
syntax = "proto3";
package WeightEstimationUpdate;
option java_package = "com.muyuan.platform.bar.patrol.pro";
// 請求包基類(沒有附加數據,通信包不重新定義直接使用基類包)
message BaseRequestCommon
{
string DeviceId = 1; // 設備編號
string MsgID = 2; // 消息ID,用UUID
string Timestamp = 3; // unix時間戳(秒)
uint32 Cmd = 4; // 指令信息
bytes payLoad = 5; // 消息體
}
// 上報
message DeviceRegist
{
string version = 1; //
string macAddr = 2; //
}
// 下發
message PushUpgradeInfo
{
string version = 1; // 版本號
string packageName = 2; //
string packageMd5 = 3; //
string packageUrl = 4; //
}
// 上報
message ReportWeightEstimationStatus
{
string version = 1; //
string state = 2; //
}
// 指令列表
enum EmCmd
{
CMD_NONE = 0x0000; // 指令開始范圍
//-----------------服務器端主動下發到設備端信令定義開始------------------
CMD_S2C_PUSH_UPGRADE_INFO = 0x0013; // 下發(協議包:PushUpgradeInfo)
//-----------------服務器端主動下發到設備端信令定義結束-----------------
//-----------------設備端主動上報到服務端信令定義開始-------------------
CMD_C2S_REPORT_REGIST = 0x0060; // 注冊(協議包:WeightEstimationRegist)
CMD_C2S_REPORT_FAULT = 0x0061; // 上報故障(協議包:ReportFault)
CMD_C2S_REPORT_WEIGHT_ESTIMATION_STATUS = 0x0063; // 上報狀態信息(協議包:WeightEstimationStatus)
//-----------------設備端主動上報到服務端信令定義結束-----------------
CMD_END = 0xFFFF; // 指令結束范圍
}
情況1: 收到通信信息
import test_pb2 as weight_pd
base_request_common_obj = weight_pd.BaseRequestCommon()
base_request_common_obj.ParseFromString(msg)
payload = base_request_common_obj.payLoad
push_upgrade_info_obj = weight_pd.PushUpgradeInfo()
push_upgrade_info_obj.ParseFromString(payload)
update_version = push_upgrade_info_obj.version
update_zip_filename = push_upgrade_info_obj.packageName
# 反向解析即可
情況2:發送通信信息
import test_pb2 as weight_pd
base_request_common = weight_pd.BaseRequestCommon()
base_request_common.DeviceId = deviceId
base_request_common.MsgID = str(uuid.uuid4())
base_request_common.Timestamp = str(int(time.time()))
# change
item_list = weight_pd.EmCmd.items()
#此為 protobuf 3.0.0 版本的
weight_dict = listtuple_dict(item_list)
base_request_common.Cmd = weight_dict.get("CMD_C2S_REPORT_WEIGHT_ESTIMATION_STATUS")
#此為 protobuf 最新版本
# base_request_common.Cmd = weight_pd.EmCmd.CMD_C2S_REPORT_WEIGHT_ESTIMATION_STATUS
report_weight_estimation_status = weight_pd.ReportWeightEstimationStatus()
report_weight_estimation_status.version = self.version
report_weight_estimation_status.state = state
base_request_common.payLoad = report_weight_estimation_status.SerializeToString()
serializeToString = base_request_common.SerializeToString()
# serializeToString 即為 二進制數據流
def listtuple_dict(item_list):
weight_cmd_dict = {}
for k, v in item_list:
weight_cmd_dict.setdefault(k, v)
return weight_cmd_dict```
到此這篇關于python使用protobuf的文章就介紹到這了,更多相關python使用protobuf內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持腳本之家!
您可能感興趣的文章:- java程序中protobuf的基本用法示例
- 淺談序列化之protobuf與avro對比(Java)
- 基于Protobuf動態解析在Java中的應用 包含例子程序
- protobuf c++編程筆記
- SpringBoot使用protobuf格式的接口方式
- Netty結合Protobuf進行編解碼的方法
- Python使用protobuf序列化和反序列化的實現
- Protobuf在Cmake中的正確使用方法詳解
- C#語言使用gRPC、protobuf(Google Protocol Buffers)實現文件傳輸功能
- 在java程序中使用protobuf