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的更多相关文章

  1. Python爬取CSDN博客文章

    0 url :http://blog.csdn.net/youyou1543724847/article/details/52818339Redis一点基础的东西目录 1.基础底层数据结构 2.win ...

  2. 为Cocos2d-x的Android平台加入Protobuffer支持

    为Cocos2d-x的Android平台加入Protobuffer支持 分类: 工作2013-11-27 18:00 386人阅读 评论(1) 收藏 举报 cocos2d-xandroid平台交叉编译 ...

  3. Erlang使用ProtoBuffer

    最近有工作需要打算为项目服务器做一个机器人,测试测试压力,根据自己的经验,使用Erlang来做是最合适不过的了,但是服务器使用的C++语言,使用了Google的ProtoBuffer作为协议进行数据交 ...

  4. Protobuffer简介c#

    一.Protobuffer和json深度对比 JSON相信大家都知道是什么东西,如果不知道,那可就真的OUT了,GOOGLE一下去.这里就不介绍啥的了. Protobuffer大家估计就很少听说了,但 ...

  5. 从微信SDK看ProtoBuffer文件的生成

    前言 Protocol Buffers (下面简称PB)是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,很适合做数据存储或 RPC 数据交换格式.它可用于通讯协议.数据存储等领域的语言无 ...

  6. thrift与protobuffer的区别

    thrift由facebook出品,protobuffer由google出品: 下面对比一下这两个的区别.参考:http://zhidao.baidu.com/link?url=yNLBeHhWokf ...

  7. Python中的多进程与多线程(一)

    一.背景 最近在Azkaban的测试工作中,需要在测试环境下模拟线上的调度场景进行稳定性测试.故而重操python旧业,通过python编写脚本来构造类似线上的调度场景.在脚本编写过程中,碰到这样一个 ...

  8. Python高手之路【六】python基础之字符串格式化

    Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存.[PEP-3101] This ...

  9. Python 小而美的函数

    python提供了一些有趣且实用的函数,如any all zip,这些函数能够大幅简化我们得代码,可以更优雅的处理可迭代的对象,同时使用的时候也得注意一些情况   any any(iterable) ...

随机推荐

  1. day 23-1 类的命名空间、组合

    类的命名空间 类与对象命名空间 类里 可以定义两种属性 静态属性 动态属性 类中的静态变量 可以被对象和类调用对于不可变数据类型来说,类变量最好用类名操作对于可变数据类型来说,对象名的修改是共享的,重 ...

  2. delphi 获取时间戳 如何得到 和 js 中 new Date().getTime();的 相同?

    new Date().getTime();  //1533213439019 通过,启发 function DateTimeToUnix(const AValue: TDateTime): Int64 ...

  3. 风火轮SMC532使用

    2018年3月份申请了一个院创,要做一个基于NFC技术的考勤设备,想法是用手机的NFC将学号信息传导考勤机,由考勤机统计缺勤信息,因为自己的拖延症,一直拖到现在.现在一边写毕业论文一边准备院创答辩,又 ...

  4. LeetCode第二十三题-合并n个有序链表

    Merge k Sorted Lists 问题简介:合并k个已排序的链表并将其作为一个排序链表返回. 举例: 输入: [ 1->4->5, 1->3->4, 2->6 ] ...

  5. 一个简单的go语言爬虫

    package main import ( "bufio" "fmt" "golang.org/x/net/html/charset" &q ...

  6. 工程师的URL大全

    作者:邓聪聪 https://bgp.he.net/ip                    #关于IP地址广播的AS查询及地址所属 http://ipwhois.cnnic.net.cn/    ...

  7. sed 修改文本

    修改文本是指将所匹配的文本行利用新文本替代,sed编辑命令的修改文本符号为 c\, [ sed]$ more input [ sed]$ more aa.sed #!/bin/sed -f //c\ ...

  8. Gitlab_ansible_jenkins三剑客③Ansible的安装及使用

    一台服务器可能会安装不同的python应用,不同的应用可能使用的模块版本不同,如果都安装在同样的环境下容易冲突,为了避免冲突,引入virtualenv 这个包管理工具进行环境的隔离 使用pip安装之前 ...

  9. SSM增删改查

    闲着无聊配置一遍SSM以及添加功能增删改查,如下图,其中坎坷也挺多!!! 1.工程如下图.(请忽略红叉,没有错误) 2.首先配置pom.xml文件. <project xmlns="h ...

  10. Python学习笔记十一

    1. 协程 并发的解决方案: 多进程      多线程      什么叫并发:看起来同时进行 如何实现并发:切换+保存状态 进程线程都是由操作系统调度的 协程:单线程下实现的并发,应用程序级别的切换, ...