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)
|