本文介绍 干货!一文掌握Protobuf所有语言所有用法,快收藏!

干货!一文掌握Protobuf所有语言所有用法,快收藏!

本文由林大佬原创,转载请注明出处,来自腾讯、阿里等一线AI算法工程师组成的QQ交流群欢迎你的加入: 1037662480

说实话,Protobuf这个库,让人相见时难别亦难,东风无力百花残,每次等到要用它的时候,总感觉还没有完全掌握它的用法,而实际上等去百度或者谷歌的时候,教程都是多么的凌乱不堪。学会它,最直接关系到的,我能想到的应用最广的两个领域,一个是Tensorflow,几乎你的模型存储都需要和它打交道,另一个是机器人领域,比如你用ROS,很多公司会用Protobuf代替ROS原生的消息写法,再比如百度Apollo里面的消息定义全是Protobuf的方式。

Protobuf具有啥优点咱juice不在赘述了,速度快,跨平台,跨语言啥的,我认为最好的可能还是一次定义永久使用吧,不管你啥语言都有很好的方式去parse,去定义,去修改。但是难就难在这个地方,它并没有我们的传统的yml,json,xml那么直观。有时候甚至有点复杂。今天这篇文章就是教你如何掌握它。

Python下的用法

先从简单的说起吧,先说一下python下面要怎么用。

1. Protobuf的定义和保存

第一步就是定义,然后我们把它保存到pb的二进制格式。比如我们定义一个很简单的Proto:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
syntax = "proto2";

enum EmployeeType {
  UNKNOWN = 0;
  MAN = 1;
  WOMEN = 2;
}

message Employee {
  optional EmployeeType type = 1;
  optional string name = 2;
  repeated double duty = 3;
}

message Company {
  repeated Employee employees = 1;
}

我们定义了一个公司,公司里面很多个员工,员工也分为很多属性。把它做成一个python 文件:

protoc a.proto --python_out=./

这样的话,你可以拿到生成的数据类型了,我们主要看两个用法:

  • 创建一个Company,塞进去两个员工,结果保存为二进制和pbtxt文件;
  • 反过来读取这个二进制和这个pbtxt文件。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
from a_pb2 import *
import a_pb2

com = Company()
em1 = Employee()
em1.type = a_pb2.MAN
em1.name = 'Luca'
com.append(em1)

em2 = Employee()
em2.type = a_pb2.MAN
em2.name = 'Shit'
com.append(em2)

with open('a.pb.txt', 'w') as f:
    f.write(str(com))
print('done.')

这样就ok了。 生成的pbtxt可以直接查看。

读取如何读取呢? 其实也很简单:

1
2
3
4
5
6
from google.protobuf import text_format

with open('a.pb.txt', 'r') as f:
    com = Company()
    text_format.Merge(f.read(), com)
    print(com)

至此,我们完成了python的probuf文件的写入和读取。当然,如你想直接保存二进制或者读取二进制,可以直接用SerializeToString的方法,这里serialize并非是string,而是二进制。

后面我们会继续更新C++场景下的protobuf使用方法。