如何在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脚本对Linux服务器进行监控的教程
Apr 02 Python
安装dbus-python的简要教程
May 05 Python
Python计算已经过去多少个周末的方法
Jul 25 Python
Python的GUI框架PySide的安装配置教程
Feb 16 Python
python实现事件驱动
Nov 21 Python
django2.2安装错误最全的解决方案(小结)
Sep 24 Python
VSCode中自动为Python文件添加头部注释
Nov 14 Python
django处理select下拉表单实例(从model到前端到post到form)
Mar 13 Python
详解python环境安装selenium和手动下载安装selenium的方法
Mar 17 Python
Keras中 ImageDataGenerator函数的参数用法
Jul 03 Python
Python编写万花尺图案实例
Jan 03 Python
Pandas之缺失数据的实现
Jan 06 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
用PHP连接MySQL代码的参数说明
2008/06/07 PHP
php 计划任务 检测用户连接状态
2012/03/29 PHP
Laravel Validator自定义错误返回提示消息并在前端展示
2019/05/09 PHP
在laravel5.2中实现点击用户头像更改头像的方法
2019/10/14 PHP
yii2.0框架数据库操作简单示例【添加,修改,删除,查询,打印等】
2020/04/13 PHP
JS 有名函数表达式全面解析
2010/03/19 Javascript
jQuery数据显示插件整合实现代码
2011/10/24 Javascript
js获取网页高度(详细整理)
2012/12/28 Javascript
谈谈Jquery中的children find 的区别有哪些
2015/10/19 Javascript
JavaScript中获取Radio被选中的值
2015/11/11 Javascript
分享使用AngularJS创建应用的5个框架
2015/12/05 Javascript
jQuery插件dataTables添加序号列的方法
2016/07/06 Javascript
angular2系列之路由转场动画的示例代码
2017/11/09 Javascript
vue在使用ECharts时的异步更新和数据加载详解
2017/11/22 Javascript
200行代码实现blockchain 区块链实例详解
2018/03/14 Javascript
使用wxapp-img-loader自定义组件实现微信小程序图片预加载功能
2018/10/18 Javascript
vue项目使用高德地图的定位及关键字搜索功能的实例代码(踩坑经验)
2020/03/07 Javascript
JS this关键字在ajax中使用出现问题解决方案
2020/07/17 Javascript
[01:33:30]DOTA2-DPC中国联赛 正赛 RNG vs Phoenix BO3 第二场 2月5日
2021/03/11 DOTA
python复制与引用用法分析
2015/04/08 Python
详解Django中Request对象的相关用法
2015/07/17 Python
利用Python的Django框架生成PDF文件的教程
2015/07/22 Python
python opencv捕获摄像头并显示内容的实现
2019/07/11 Python
python rsa实现数据加密和解密、签名加密和验签功能
2019/09/18 Python
Python cookie的保存与读取、SSL讲解
2020/02/17 Python
python 如何停止一个死循环的线程
2020/11/24 Python
anello泰国官方网站:日本流行包包品牌
2019/08/08 全球购物
构造方法和其他方法的区别?怎么调用父类的构造方法
2013/09/22 面试题
规划编制实施方案
2014/03/15 职场文书
领导班子“四风问题”“整改方案
2014/10/02 职场文书
重阳节主题班会
2015/08/17 职场文书
2016入党积极分子考察评语
2015/12/01 职场文书
大学生暑期社会实践的个人总结!
2019/07/17 职场文书
CSS3实现模糊背景的三种效果示例
2021/03/30 HTML / CSS
面试提问mysql一张表到底能存多少数据
2022/03/13 MySQL
win10如何开启ahci模式?win10开启ahci模式详细操作教程
2022/07/23 数码科技