【proto】python根据proto文件构造message,并换为二进制
一、场景
测试需要构造数据,而且存储的格式为grpc消息的二进制格式,所以必须要根据proto构造二进制
二、构造方法
1、根据proto文件生成python格式的pb文件
python3 -m grpc_tools.protoc -I. proto/upload_state.proto --python_out=. --grpc_python_out=.
2、检查文件生成
3、编写构造脚本
from google.protobuf.json_format import MessageToJson import upload_state_pb2 as upload_state_pb2 def pack_data_proto_obj(vehicle, data_info_list): # 生成file_info_list file_info_list_obj = upload_state_pb2.FileInfoList() file_info_list_obj.update_operation = "UPDATE" for data_info in data_info_list:for index in range(len(data_info)): # 生成file_info对象 file_info_obj = upload_state_pb2.FileInfo() file_info_obj.file_name = data_info[index]["file_name"].replace("vehicle", vehicle) file_info_obj.file_type = data_info[index]["file_type"]
...... file_info_obj.del_flag = data_info[index]["del_flag"] file_info_list_obj.file_infos.append(file_info_obj) # 生成vehicle_upload_info vehicle_upload_info_obj = upload_state_pb2.VehicleUploadInfo() vehicle_upload_info_obj.vehicle = vehicle vehicle_upload_info_obj.msg_type = data["msg_type"] vehicle_upload_info_obj.file_info_list.CopyFrom(file_info_list_obj) proto_data = vehicle_upload_info_obj.SerializeToString() print(proto_data) vehicle_upload_info_obj2 = upload_state_pb2.VehicleUploadInfo() vehicle_upload_info_obj2.ParseFromString(proto_data) json_string = MessageToJson(vehicle_upload_info_obj2) print(json_string) return proto_data # 转proto字符串 # vehicle_upload_info_obj1 = upload_state_pb2.VehicleUploadInfo() # vehicle_upload_info_obj1.ParseFromString(proto_data) # print(vehicle_upload_info_obj1)
vehicle_upload_info_obj2 = upload_state_pb2.VehicleUploadInfo()
vehicle_upload_info_obj2.ParseFromString(proto_data)
json_string = MessageToJson(vehicle_upload_info_obj2)
print(json_string)
if __name__ == '__main__': pass
内容省略,主要是三层message嵌套
关键点就是append和CopyFrom来组装
消息转换的方法MessageToJson,ParseFromString
参考链接:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?