如何在mac环境中用python处理protobuf


Posted in Python onDecember 25, 2019

这篇文章主要介绍了如何在mac环境中用python处理protobuf,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

安装

brew install protobuf

然后再安装protobuf需要的依赖

brew install autoconf automake libtool

验证是否安装成功

protoc ?version

protobuf3语法介绍

1.字段前取消了required和optional两个关键字,目前可用的只有repeated关键字。

2.不可以现设置默认值了。

a.string默认为空串

b.枚举默认为第一个枚举定义的第一个值。并且必须是0,必须有有一个0值,我们可以用这个0值作为默认值。
这个零值必须为第一个元素,为了兼容proto2语义,枚举类的第一个值总是默认值。

c.bytes默认为空bytes

d.bool默认为false

e.数字类型默认为0

3.protoType类型如下:

double、float、int32、int64、uint32、uint64、sint32、sint64、fixed32、fixed64、sfixed32、sfixed64、bool、string、bytes

4、分配标识号

正如你所见,在消息定义中,每个字段都有唯一的一个数字标识符。这些标识符是用来在消息的二进制格式中识别各个字段的,一旦开始使用就不能够再改变。注:[1,15]之内的标识号在编码的时候会占用一个字节。[16,2047]之内的标识号则占用2个字节。所以应该为那些频繁出现的消息元素保留 [1,15]之内的标识号。切记:要为将来有可能添加的、频繁出现的标识号预留一些标识号。

最小的标识号可以从1开始,最大到2^29 - 1, or 536,870,911。不可以使用其中的[19000-19999]( (从FieldDescriptor::kFirstReservedNumber 到 FieldDescriptor::kLastReservedNumber))的标识号, Protobuf协议实现中对这些进行了预留。如果非要在.proto文件中使用这些预留标识号,编译时就会报警。同样你也不能使用早期保留的标识号。

指定字段规则

所指定的消息字段修饰符必须是如下之一:

  • singular:一个格式良好的消息应该有0个或者1个这种字段(但是不能超过1个)。
  • repeated:在一个格式良好的消息中,这种字段可以重复任意多次(包括0次)。重复的值的顺序会被保留。

在proto3中,repeated的标量域默认情况虾使用packed。

编写protoco文件,addressbook.proto。

syntax = "proto3"; //正在使用proto3语法,如果你没有指定这个,编译器会使用proto2
package tutorial;

//*.proto文件中数据类型可以分为两大类:
//复合数据类型包括:枚举和message类型
//标准数据类型包含:整型,浮点,字符串等

message AddressBook {
 //repeated: 该字段可以重复任意次数,包括0次。重复数据的顺序将会保存在protocol buffer中,将这个字段想象成一个可以自动设置size的数组就可以了。
 repeated Person people = 1;
}

message Person {
 //每个字段有一种类型
 //该Number是用来标记该字段在序列化后的二进制数据中所在的field,
 //每个字段的Number在message内部都是独一无二的。也不能进行改变,否则数据就不能正确的解包
 string name = 1;
 int32 id = 2;
 string email = 3;
 float money =4;
 bool work_status = 5;
 repeated PhoneNumber phones =6;
 MyMessage maps =7;
}
message PhoneNumber{
   string number =1;
   PhoneType type =2;
}

enum PhoneType{
  MOBILE =0;
  HOME =1;
  WORK =2;

}

message MyMessage{
  map<int32,int32> mapfield =1;
}

编译生成python代码

protoc ./addressbook.proto --python_out=./

创建一个解析文件

protobufdemo.py

# -*- coding: utf-8 -*-
# @Time : 2019-11-15 11:25
# @Author : cxa
# @File : protobufdemo.py
# @Software: PyCharm
import addressbook_pb2

address_book = addressbook_pb2.AddressBook()
person = address_book.people.add()
person.id = 1
person.name = "cxa"
person.email = "1@qq.com"
person.money = 1234.00
person.work_status = True

phone_number = person.phones.add()
phone_number.number = "123456"
phone_number.type = addressbook_pb2.MOBILE
maps = person.maps
maps.mapfield[1] = 1
maps.mapfield[2] = 2

# 序列化
serializeTostring = address_book.SerializeToString() # 生成字节数组
str_result = address_book.ParseFromString(serializeTostring) # 转为字符串
print(str_result)
for person in address_book.people:
  print(person)

for phone_number in person.phones:
  print(phone_number)

for key in person.maps.mapfield:
  print(key, person.maps.mapfield[key])

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Django中的CBV和FBV示例介绍
Feb 25 Python
利用Pycharm断点调试Python程序的方法
Nov 29 Python
python实现播放音频和录音功能示例代码
Dec 30 Python
为什么你还不懂得怎么使用Python协程
May 13 Python
对python 调用类属性的方法详解
Jul 02 Python
Django框架之登录后自定义跳转页面的实现方法
Jul 18 Python
在tensorflow中设置保存checkpoint的最大数量实例
Jan 21 Python
python读取多层嵌套文件夹中的文件实例
Feb 27 Python
Python实现鼠标自动在屏幕上随机移动功能
Mar 14 Python
Python turtle库的画笔控制说明
Jun 28 Python
Python爬虫之App爬虫视频下载的实现
Dec 08 Python
Python+Appium实现自动化清理微信僵尸好友的方法
Feb 04 Python
Python Print实现在输出中插入变量的例子
Dec 25 #Python
django数据模型(Model)的字段类型解析
Dec 25 #Python
python装饰器的特性原理详解
Dec 25 #Python
Python将列表中的元素转化为数字并排序的示例
Dec 25 #Python
python中的subprocess.Popen()使用详解
Dec 25 #Python
python打印n位数“水仙花数”(实例代码)
Dec 25 #Python
python中有关时间日期格式转换问题
Dec 25 #Python
You might like
咖啡是不是喝了会上瘾?咖啡是必须品吗!
2021/03/04 新手入门
PHP+JS实现的实时搜索提示功能
2018/03/13 PHP
GreyBox技术总结(转)
2010/11/23 Javascript
js下关于onmouseout、事件冒泡的问题经验小结
2010/12/09 Javascript
在Javascript中 声明时用&quot;var&quot;与不用&quot;var&quot;的区别
2013/04/15 Javascript
深入领悟JavaScript中的面向对象
2013/11/18 Javascript
JavaScript初学者建议:不要去管浏览器兼容
2014/02/04 Javascript
浅谈javascript实现八大排序
2015/04/27 Javascript
JQuery对ASP.NET MVC数据进行更新删除
2016/07/13 Javascript
百度地图API之百度地图退拽标记点获取经纬度的实现代码
2017/01/12 Javascript
jquery.form.js异步提交表单详解
2017/04/25 jQuery
JQuery实现定时刷新功能代码
2017/05/09 jQuery
jquery引入外部CDN 加载失败则引入本地jq库
2018/05/23 jQuery
自己动手封装一个React Native多级联动
2018/09/19 Javascript
使用JavaScript计算前一天和后一天的思路详解
2019/12/20 Javascript
Python压缩解压缩zip文件及破解zip文件密码的方法
2015/11/04 Python
学习python之编写简单简单连接数据库并执行查询操作
2016/02/27 Python
Python实现的基于优先等级分配糖果问题算法示例
2018/04/25 Python
python的pandas工具包,保存.csv文件时不要表头的实例
2018/06/14 Python
python的中异常处理机制
2018/08/30 Python
在Pycharm中使用GitHub的方法步骤
2019/06/13 Python
解决Python3 控制台输出InsecureRequestWarning问题
2019/07/15 Python
Python下opencv图像阈值处理的使用笔记
2019/08/04 Python
Python如何把多个PDF文件合并代码实例
2020/02/13 Python
Python 安装 virturalenv 虚拟环境的教程详解
2020/02/21 Python
总结Pyinstaller的坑及终极解决方法(小结)
2020/09/21 Python
谈谈python垃圾回收机制
2020/09/27 Python
浅谈HTML5 Web Worker的使用
2018/01/05 HTML / CSS
学生自我鉴定
2013/12/18 职场文书
国贸专业大学生职业生涯规划范文
2014/01/10 职场文书
仓库管理员岗位职责
2014/03/19 职场文书
党支部特色活动方案
2014/08/20 职场文书
工程项目经理岗位职责
2015/02/02 职场文书
施工员岗位职责
2015/02/10 职场文书
催款函怎么写
2015/06/24 职场文书
CSS 实现Chrome标签栏的技巧
2021/08/04 HTML / CSS