背景
最近由于工作需要,需要做一些IDL
的事情,参考对象就是Google Protocol Buffers
。学习的过程中做一些记录
介绍
官方文档:https://developers.google.com/protocol-buffers/
Github:https://github.com/protocolbuffers/protobuf/tree/master/python
安装
安装其实比较简单,按照步骤安装就好了,Mac
自带的Python
就可以直接支持,但是有几个坑需要注意
Protocol Buffers
现阶段的安装包没有configure
文件,需要自己打包
从Github
上下载下源码之后,需要运行./autogen.sh
来自行生成configure
文件。
- 生成
configure
的过程中报错autoconf
不存在
brew install autoreconf
brew install automake
brew install libtool
用brew
直接安装这三个东西即可解决
- 运行
python setup.py install
后依然会报错google not found
这个报错是比较奇怪,一般来说会直接把依赖包安装完毕,但是我这里确实是遇到了这个坑,解决办法是直接手工安装google
。
sudo pip install protobuf
sudo pip install google
参考官方文档撸码
具体的过程就不记录了,基本上完全照搬官方文档的代码,记录几个坑。
proto文件的版本标识
syntax = "proto2";
在协议文件的最上方需要标识出版本号,2和3是有一些区别的:
- 3中不需要定义
require
和optional
,只有repeat
声明仍然保留 - 3中自带默认值,不能自定义默认值,这样在序列化的时候就可以节省空间
- 3中支持map的编写
- 3中支持
json
的映射
编写的记录
首先要根据协议生成一个Python
对象。比如addressbook_pb2
。有兴趣的可以直接去看这个类的内容,基本上是定义一些空类和方法的声明,具体的操作API
还是参考官方的说明比较靠谱。
用Python
操作Protocol Buffers
的时候,有几个注意点。
- 操作
repeat
对象
repeat
对象在Python
中的对应可以理解为是数组。如果需要新增一个数组元素的话,需要这样调用
phone_number = person.phones.add()
phone_number.number = number
phone_number.type = addressbook_pb2.Person.MOBILE
说实话,并不太符合Python
优雅的语法。如