如何在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 相关文章推荐
用Python的线程来解决生产者消费问题的示例
Apr 02 Python
获取Django项目的全部url方法详解
Oct 26 Python
python对list中的每个元素进行某种操作的方法
Jun 29 Python
Python实现登陆文件验证方法
Oct 06 Python
在Python中Dataframe通过print输出多行时显示省略号的实例
Dec 22 Python
python 实现分页显示从es中获取的数据方法
Dec 26 Python
pandas ix &amp;iloc &amp;loc的区别
Jan 10 Python
利用matplotlib实现根据实时数据动态更新图形
Dec 13 Python
python之生成多层json结构的实现
Feb 27 Python
Python 改变数组类型为uint8的实现
Apr 09 Python
Prometheus开发中间件Exporter过程详解
Nov 30 Python
Python实现批量将文件复制到新的目录中再修改名称
Apr 12 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
回首过去10年中最搞笑的10部动漫,哪一部让你节操尽碎?
2020/03/03 日漫
基于php iconv函数的使用详解
2013/06/09 PHP
php中实现获取随机数组列表的自定义函数
2015/04/02 PHP
php项目中百度 UEditor 简单安装调试和调用
2015/07/15 PHP
PHP正则验证字符串是否为数字的两种方法并附常用正则
2019/02/27 PHP
PHP框架实现WebSocket在线聊天通讯系统
2019/11/21 PHP
在textarea中显示html页面的javascript代码
2007/04/20 Javascript
msn上的tab功能Firefox对childNodes处理的一个BUG
2008/01/21 Javascript
JavaScript CSS修改学习第一章 查找位置
2010/02/19 Javascript
使用 JScript 创建 .exe 或 .dll 文件的方法
2011/07/13 Javascript
js猜数字小游戏的简单实现代码
2013/07/02 Javascript
通过url查找a元素并点击
2014/04/09 Javascript
使用angularjs创建简单表格
2016/01/21 Javascript
Vue精简版风格概述
2018/01/30 Javascript
基于JavaScript实现幸运抽奖页面
2020/07/05 Javascript
JS从非数组对象转数组的方法小结
2018/03/26 Javascript
Nuxt.js开启SSR渲染的教程详解
2018/11/30 Javascript
JavaScript实现星级评价效果
2019/05/17 Javascript
微信小程序实现签字功能
2019/12/23 Javascript
微信小程序点击按钮动态切换input的disabled禁用/启用状态功能
2020/03/07 Javascript
Python多线程编程(七):使用Condition实现复杂同步
2015/04/05 Python
Python模拟浏览器上传文件脚本的方法(Multipart/form-data格式)
2018/10/22 Python
python学习之hook钩子的原理和使用
2018/10/25 Python
Django框架模板语言实例小结【变量,标签,过滤器,继承,html转义】
2019/05/23 Python
pytorch多GPU并行运算的实现
2019/09/27 Python
Python matplotlib 绘制双Y轴曲线图的示例代码
2020/06/12 Python
keras使用Sequence类调用大规模数据集进行训练的实现
2020/06/22 Python
梅西酒窖:Macy’s Wine Cellar
2018/01/07 全球购物
俄罗斯在线购买飞机票、火车票、巴士票网站:Tutu.ru
2020/03/16 全球购物
《母鸡》教学反思
2014/02/25 职场文书
信息管理应届生求职信
2014/03/07 职场文书
建议书标准格式
2014/03/12 职场文书
六一儿童节演讲稿
2014/05/23 职场文书
优秀班集体申报材料
2014/12/25 职场文书
党支部鉴定意见
2015/06/02 职场文书
Python使用Opencv打开笔记本电脑摄像头报错解问题及解决
2022/06/21 Python