如何在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解析XML的几种常见方法的介绍
Apr 09 Python
简单介绍Python中的几种数据类型
Jan 02 Python
Python实现可获取网易页面所有文本信息的网易网络爬虫功能示例
Jan 15 Python
Python Json序列化与反序列化的示例
Jan 31 Python
Python with语句上下文管理器两种实现方法分析
Feb 09 Python
pandas表连接 索引上的合并方法
Jun 08 Python
用Python逐行分析文件方法
Jan 28 Python
python实现转圈打印矩阵
Mar 02 Python
解决Tensorflow sess.run导致的内存溢出问题
Feb 05 Python
Django DRF认证组件流程实现原理详解
Aug 17 Python
pytho matplotlib工具栏源码探析一之禁用工具栏、默认工具栏和工具栏管理器三种模式的差异
Feb 25 Python
Python趣味实战之手把手教你实现举牌小人生成器
Jun 07 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 枚举类型的管理与设计知识点总结
2020/02/13 PHP
Javascript操纵Cookie实现购物车程序
2007/02/15 Javascript
javascript window.opener的用法分析
2010/04/07 Javascript
jquery1.5.1中根据元素ID获取元素对象的代码
2011/04/02 Javascript
js根据给定的日期计算当月有多少天实现思路及代码
2013/02/25 Javascript
弹出最简单的模式化遮罩层的js代码
2013/12/04 Javascript
jQuery获得内容和属性示例代码
2014/01/16 Javascript
JavaScript的null和undefined区别示例介绍
2014/09/15 Javascript
js图片模糊切换显示特效的方法
2015/02/17 Javascript
javascript实现鼠标放上后下边对应内容变换的效果
2015/08/06 Javascript
理解jquery事件冒泡
2016/01/03 Javascript
值得分享的轻量级Bootstrap Table表格插件
2016/05/30 Javascript
微信小程序组件 contact-button(客服会话按钮)详解及实例代码
2017/01/10 Javascript
bootstrap 设置checkbox部分选中效果
2017/04/20 Javascript
js实现倒计时关键代码
2017/05/05 Javascript
D3.js进阶系列之CSV表格文件的读取详解
2017/06/06 Javascript
Vue组件之极简的地址选择器的实现
2018/05/31 Javascript
javascript数组的定义及操作实例
2019/11/10 Javascript
JavaScript 自定义html元素鼠标右键菜单功能
2019/12/02 Javascript
javascript将16进制的字符串转换为10进制整数hex
2020/03/05 Javascript
举例讲解Python中的list列表数据结构用法
2016/03/12 Python
Python获取linux主机ip的简单实现方法
2016/04/18 Python
python实现图书管理系统
2018/03/12 Python
python 将数据保存为excel的xls格式(实例讲解)
2018/05/03 Python
python scatter散点图用循环分类法加图例
2019/03/19 Python
python入门之基础语法学习笔记
2020/02/08 Python
Django封装交互接口代码
2020/07/12 Python
美国顶尖折扣时尚购物网:Bluefly
2016/08/28 全球购物
数据库测试通常都包括哪些方面
2015/11/30 面试题
建设投标担保书
2014/05/13 职场文书
基层党支部公开承诺书
2014/05/29 职场文书
学校食品安全责任书
2015/01/29 职场文书
2016教师校本培训心得体会
2016/01/08 职场文书
MySQL获取所有分类的前N条记录
2021/05/07 MySQL
Win11 Build 21996.1 Dev版怎么样? win11系统截图欣赏
2021/11/21 数码科技
Oracle查看表空间使用率以及爆满解决方案详解
2022/07/23 Oracle