Python使用ProtoBuffer
Python使用ProtoBuffer
Protocol Buffers,是Google公司开发的一种数据描述语言,类似于XML能够将结构化数据序列化,可用于数据存储、通信协议等方面。
就可读性而言感觉没有JSON直接,不过由于使用二进制传输,效率得到大大提升,用在RPC比较合适
1. 安装
在Ubuntu下非常方便
pip install protobuf # 安装protobuf库
sudo apt-get install protobuf-compiler # 安装protobuf编译器
2. 定义数据类型
syntax = "proto2";
package demo; // 申明包,防止命名冲突
// message类似于class,用于定义一个数据结构
// message之间可以相互嵌套
message Person{
required string name = 1; // 1,2,3是字段的标识符
required int32 id = 2;
optional string email = 3;
enum PhoneType {
MOBILE = 1;
HOME = 2;
WORK = 3;
}
message PhoneNumber {
required string number = 1;
optional PhoneType type = 2 [default = HOME];
}
// 修饰符:required表示必须有,optional表示可选
// repeated表示可有多个(包括0个)
repeated PhoneNumber phones = 4;
}
message AdressBook {
required Person people = 1;
}
3.编译
# 通用格式
protoc -I=$SRC_DIR --python_out=$DST_DIR $SRC_DIR/addressbook.proto
# 这里,我们直接在当前目录编译
protoc --python_out=./ ./addressbook.proto
结果会在目标地址下生成addressbook_pb2.py
4. 文件写入
# coding=utf-8
import addressbook_pb2
address_book = addressbook_pb2.AdressBook()
#### person1 ###
p1 = address_book.people.add()
p1.name = "Jack"
p1.id = 20
p1.email = "jack@qq.com"
phone_num1 = p1.phones.add()
phone_num1.number = "123"
phone_num1.type = 2 # 与默认类型不同
phone_num2 = p1.phones.add()
phone_num2.number = "456"
print(p1)
### person2 ###
p2 = address_book.people.add()
p2.name = "Chen"
p2.id = 21
# 遍历,输出repeated类型的成员
for phone in p1.phones:
print(phone.type)
# 保存到二进制文件
f = open("address.pb", "wb")
f.write(address_book.SerializeToString()) # 调用串行化接口
f.close()
运行输出
name: "Jack"
id: 20
email: "jack@qq.com"
phones {
number: "123"
type: HOME
}
phones {
number: "456"
}
2
3
5. 文件读取
# coding=utf-8
import addressbook_pb2
f = open("address.pb", "rb")
address_book = addressbook_pb2.AdressBook()
address_book.ParseFromString(f.read())
f.close()
for person in address_book.people:
print(person.name)
运行输出
Jack
Chen
6.小结
protobuffer
用二进制来传输,性能应该会有提升.但是双方都要保留一份编译后的pb2文件,相当于协议,感觉稍重稍复杂
Python使用ProtoBuffer的更多相关文章
- Python爬取CSDN博客文章
0 url :http://blog.csdn.net/youyou1543724847/article/details/52818339Redis一点基础的东西目录 1.基础底层数据结构 2.win ...
- 为Cocos2d-x的Android平台加入Protobuffer支持
为Cocos2d-x的Android平台加入Protobuffer支持 分类: 工作2013-11-27 18:00 386人阅读 评论(1) 收藏 举报 cocos2d-xandroid平台交叉编译 ...
- Erlang使用ProtoBuffer
最近有工作需要打算为项目服务器做一个机器人,测试测试压力,根据自己的经验,使用Erlang来做是最合适不过的了,但是服务器使用的C++语言,使用了Google的ProtoBuffer作为协议进行数据交 ...
- Protobuffer简介c#
一.Protobuffer和json深度对比 JSON相信大家都知道是什么东西,如果不知道,那可就真的OUT了,GOOGLE一下去.这里就不介绍啥的了. Protobuffer大家估计就很少听说了,但 ...
- 从微信SDK看ProtoBuffer文件的生成
前言 Protocol Buffers (下面简称PB)是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,很适合做数据存储或 RPC 数据交换格式.它可用于通讯协议.数据存储等领域的语言无 ...
- thrift与protobuffer的区别
thrift由facebook出品,protobuffer由google出品: 下面对比一下这两个的区别.参考:http://zhidao.baidu.com/link?url=yNLBeHhWokf ...
- Python中的多进程与多线程(一)
一.背景 最近在Azkaban的测试工作中,需要在测试环境下模拟线上的调度场景进行稳定性测试.故而重操python旧业,通过python编写脚本来构造类似线上的调度场景.在脚本编写过程中,碰到这样一个 ...
- Python高手之路【六】python基础之字符串格式化
Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存.[PEP-3101] This ...
- Python 小而美的函数
python提供了一些有趣且实用的函数,如any all zip,这些函数能够大幅简化我们得代码,可以更优雅的处理可迭代的对象,同时使用的时候也得注意一些情况 any any(iterable) ...
随机推荐
- pysvn 相关
sudo apt-get install python-svn sudo apt-get install svn-workbench 安装过程中如果缺少相关依赖下载好在执行这两条语句 安装好之后的界面 ...
- 使用scrapy爬虫,爬取今日头条首页推荐新闻(scrapy+selenium+PhantomJS)
爬取今日头条https://www.toutiao.com/首页推荐的新闻,打开网址得到如下界面 查看源代码你会发现 全是js代码,说明今日头条的内容是通过js动态生成的. 用火狐浏览器F12查看得知 ...
- Win10如何彻底禁用小娜?彻底禁用小娜的方法
原文地址:https://www.cnblogs.com/zhuimengle/p/5949152.html 小娜是Win10系统中的一款强大功能,有了它,我们对电脑的操作将更加方便.Win10系统有 ...
- 关于/tmp/ 目录自动清理文件
问题:今天开发人员给我说了一个错误:The temporary upload location [/tmp/tomcat.1337767218595042057.80/work/Tomcat/loca ...
- VMware使两台windows虚拟机能够互相ping通
1.关闭防火墙 cmd命令行里输入:netsh firewall set opmode disable 2.测试如果还不能ping通,就把网络类型选nat类型 3.测试:vmware网关默认是.2
- c++入门篇五
默认参数: //默认参数//函数的默认参数,参数后面有'='//函数参数注意事项,如有一个位置有了默认参数//那么从该位置的后面就必须要有参数 , ) { //b有默认参数,b的后面也应该要有默认参数 ...
- django学习笔记-模板层
模板层 将Python嵌入到HTML中. 模板简介 将HTML硬解码到视图并不是那么完美原因如下: 对页面设计时也需要对python代码进行相应的修改,模板可以不就行python代码修改的情况下变更设 ...
- 基于spark-streaming实时推荐系统
基于spark-streaming实时推荐系统(一) 基于spark-streaming实时推荐系统( 二) 基于spark-streaming实时推荐系统(三)
- css背景图片充满DIV
最近接手前端页面,让给调样式.哥纯粹一个代码程序猿,表示那些个样式应该让前端人员或者美工小妹妹来实现. 书归正传,碰到了问题,页面要在手机上展现,众所周知,手机在中国的牌子很多,很难做到统一. 页面上 ...
- Linux 允许或者禁止ping
Linux默认是允许Ping响应的,系统是否允许Ping由2个因素决定的:A.内核参数,B.防火墙,需要2个因素同时允许才能允许Ping,2个因素有任意一个禁Ping就无法Ping. 具体的配置方法如 ...