protobuf消息协议能够进一步减少消息体字节数, 从而提升系统运行效率; 接口明确定义字段, 使系统更加严谨可控. 本文简单总结一下python操作protobuf的方法, 以供参考。

注:文中solution_pb2是由自定义的solution.proto编译的,包含Solution,ModuleCfg等对象, 以此为例总结了protobuf的几种方法的使用。

0. proto文件生成pb文件

1
2
# proto目录下有a.proto, b.proto, c.proto, 在与proto同级目录生成pb文件
protoc -I=. --python_out=.. ./a.proto ./b.proto ./c.proto

1. 读取数据文件加载到obj

1
2
3
4
5
6
7
# USAGE1: Merge
from google.protobuf import text_format
import solution_pb2 as p

solution = p.Solution()
with open('data.prototxt', 'rb') as f:
    text_format.Merge(f.read(), solution)

2. SerializeToString和ParseFromString

1
2
3
# USAGE2: bytes -> ParseFromString, SerializeToString -> bytes
solution2 = p.Solution()
solution2.ParseFromString(solution.SerializeToString())

3. repeated简单字段添加值

1
2
3
4
5
6
# USAGE3: append
module_cfg = p.ModuleCfg()
module_cfg.name = "classification"
module_cfg.type = "PytorchClassificationModel"
module_cfg.relyon_modules.append("module-001")
module_cfg.relyon_modules.append("module-002")

4. repeated自定义类型字段添加值

1
2
# USAGE5: CopyFrom
solution.modules.add().CopyFrom(module_cfg)

5. 自定义类型字段赋值

1
2
3
4
# USAGE4: add
service_cfg = module_cfg.services.add()
serv_data = "..."
text_format.Merge(serv_data, service_cfg)

6. 导出到文本

1
2
# USAGE6: MessageToString导出到文本(str)
cfg_content = text_format.MessageToString(solution)