Python中Protobuf的基本使用

Python中Protobuf的基本使用

1. 创建proto文件

  • example.proto

    syntax = "proto2";
    package example;
    
    message ExampleRequest {
      optional int32 type = 1;
      repeated int32 list = 2;
    }
    
    message ExampleReply {
      optional int32 ret = 1;
      optional string err_msg = 2;
      repeated Item items = 3;
    }
    
    message Item {
      optional string name = 1;
    }
    

2. 生成py文件

protoc --python_out=. example.proto
# 会生成example_pb2.py文件

3. message与json、dict互转

直接看代码

import example_pb2 as pb
import google.protobuf.json_format as json_format

# dict转message
request = {
    "type": 1,
    "list": [1, 2, 3]
}

exampleReq = json_format.ParseDict(request, pb.ExampleRequest())
print(exampleReq)

# json转message
reqJson = '{"type": 2, "list": [4, 5, 6]}'
exampleReq = json_format.Parse(reqJson, pb.ExampleRequest())
print(exampleReq)

# message转json
print("json: {0}".format(json_format.MessageToJson(exampleReq)))

# message转dict
print("dict: {0}".format(json_format.MessageToDict(exampleReq)))

4. message与二进制字节流互转

# message转binary
binary = exampleReq.SerializeToString()
print("binary:{0}".format(binary))
# binary转message
msg = pb.ExampleRequest()
msg.ParseFromString(binary)
print("msg: {}".format(msg))

5. message其他操作

# 合并两个message
exampleReq.MergeFrom(exampleReq1)
print("merge message: {}".format(exampleReq))

# copy message
exampleReq.CopyFrom(exampleReq1)
print("copy message: {}".format(exampleReq))

6 message直接赋值与读取

# 直接赋值
req2 = pb.ExampleRequest()
req2.type = 1
req2.list.extend([1, 2, 3])
print("req2:{}".format(req2))

# 读取
req3 = pb.ExampleRequest()
req3.type = req2.type
# req3.list = req2.list, 这样是错误的
req3.list.extend(req2.list)  # 这样
print("req3:{}".format(req3))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值