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

这篇文章主要介绍了如何在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])

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

(0)

相关推荐

  • Mac安装python3的方法步骤

    Python有两个版本,一个是2.x版,一个是3.x版,这两个版本是不兼容的. 现在 Mac 上默认安装的 python 版本为 2.7 版本,若 安装 新版本需要 通过 该地址进行下载: https://www.python.org/ftp/python/3.5.0/python-3.5.0-macosx10.6.pkg 可 通过 敲击: python 来进行 查看python 版本. Mac 根据软件安装流程 点击 即可 完成安装,但是 如果查看 python 3.X 是否安装成功,需要 在

  • C#使用Protocol Buffer(ProtoBuf)进行Unity中的Socket通信

    首先来说一下本文中例子所要实现的功能: 基于ProtoBuf序列化对象 使用Socket实现时时通信 数据包的编码和解码 下面来看具体的步骤: 一.Unity中使用ProtoBuf 导入DLL到Unity中, 创建网络传输的模型类: using System; using ProtoBuf; //添加特性,表示可以被ProtoBuf工具序列化 [ProtoContract] public class NetModel { //添加特性,表示该字段可以被序列化,1可以理解为下标 [ProtoMem

  • Android中使用protobuf的具体示例

    简介 Google Protocol Buffers 简称 Protobuf,类似 json 或 XML,是一种序列化结构数据的机制,但是比它们更小.更快.更简单.同时支持多语言,跨平台. 目前主要有两个大版本:proto2 和 proto3. 其中 proto2 支持 Java.Python. Objective-C.和 C++. proto3 增加了对Go.JavaNano.Ruby.和 C#的支持. proto例子 syntax = "proto3"; package tutor

  • 浅谈序列化之protobuf与avro对比(Java)

    最近在做socket通信中用到了关于序列化工具选型的问题,在调研过程中开始趋向于用protobuf,可以省去了编解码的过程.能够实现快速开发,且只需要维护一份协议文件即可. 但是调研过程中发现了protobuf的一些弊端,比如需要生成相应的文件类,和业务绑定太紧密,所以在看了AVRO之后发现它完美解决了这个问题. 下面记录下对这两种序列化工具的入门与测评. 一.protobuf基本操作 protobuf简介: Protocol Buffers (a.k.a., protobuf) are Goo

  • mac下pycharm设置python版本的图文教程

    安装了pycharm 5.0.1,创建了测试项目,发现python的版本是2.6.9的,系统自带的版本好像是2.7的,为什么这样,怎么切换到2.7 看了一下系统到底装了些什么版本 居然有两个版本 接下来设置解释器的路径 Pycharm>Preferences>Build,Excution,Deployment>Console>Python Console 设置External Libraries Pycharm>Project:项目名>Project Interpret

  • mac下如何将python2.7改为python3

    1.查看当前电脑python版本 python -V  // 显示2.7.x 2.用brew升级python brew update python  3.如果安装成功,去系统目录下回看到两个版本的python cd usr/local/Cellar/ //到此目录下 cd python/ //进入python目录下 查看已安装的python版本,如果有2.x 和 3.x说明安装成功 4.将系统python版本,默认指向python3  (主要修改 ~/.bash_profile文件 和 ~/.b

  • vue中使用protobuf的过程记录

    由于目前公司采用了ProtoBuf做前后端数据交互,进公司以来一直用的是公司大神写好的基础库,完全不了解底层是如何解析的,一旦报错只能求人,作为一只还算有钻研精神的猿,应该去了解一下底层的实现,在这里记录一下学习过程. Protobuf简单介绍 Google Protocol Buffer(简称 Protobuf)是一种轻便高效的结构化数据存储格式,平台无关.语言无关.可扩展,可用于通讯协议和数据存储等领域. 有几个优点: 1.平台无关,语言无关,可扩展: 2.提供了友好的动态库,使用简单; 3

  • python如何通过protobuf实现rpc

    由于项目组现在用的rpc是基于google protobuf rpc协议实现的,所以花了点时间了解下protobuf rpc.rpc对于做分布式系统的人来说肯定不陌生,对于rpc不了解的童鞋可以自行google,这里只是做个简单的介绍.rpc的主要功能是让分布式系统的实现更为简单,为提供强大的远程调用而不损失本地调用语义的简洁性.为了实现这个目标,rpc框架需要提供一种透明调用机制让使用者不必显示区分本地调用还是远程调用.rpc架构涉及的组件如下: 客户方像调用本地方法一样去调用远程接口方法,R

  • 在go语言中安装与使用protobuf的方法详解

    简介 本文主要给大家介绍了关于go语言安装使用protobuf的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. protobuf是Google开发出来的一个语言无关.平台无关的数据序列化工具,在rpc或tcp通信等很多场景都可以使用.通俗来讲,如果客户端和服务端使用的是不同的语言,那么在服务端定义一个数据结构,通过protobuf转化为字节流,再传送到客户端解码,就可以得到对应的数据结构.这就是protobuf神奇的地方.并且,它的通信效率极高,"一条消息数据,用pr

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

    这篇文章主要介绍了如何在mac环境中用python处理protobuf,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 安装 brew install protobuf 然后再安装protobuf需要的依赖 brew install autoconf automake libtool 验证是否安装成功 protoc –version protobuf3语法介绍 1.字段前取消了required和optional两个关键字,目前可用的只有repea

  • 如何在mac下配置python虚拟环境

    安装python虚拟环境核心目的就是为了复制一个python环境,这样新项目下载的所有包,都会存放在虚拟环境下的python site-package 中 首先安装 1. sudo pip install virtualenv # 安装虚拟环境 2. sudo pip install virtualenvwrapper # 安装虚拟环境扩展包 3. vim .bash_profile # 家目录下编辑.bash_profile文件,加入以下3句 export WORKON_HOME='~/.vi

  • 通过实例解析chrome如何在mac环境中安装vue-devtools插件

    1之前在windows上装过,最近刚换了个mac本,重新安装下,也是为了记录下我安装的过程. github下载vue-devtool到本地 下载地址https://github.com/vuejs/vue-devtools#vue-devtools 注意,下载的时候默认的是在dev分支,要切换到master,然后克隆到本地(可以先放桌面) 2.将下载的项目文件放入 Chrome浏览器的插件文件夹 在浏览器地址栏输入chrome://version/ 找到路径之后,可以在顶部工具栏"前往"

  • Mac环境下搭建svn环境和使用方法

    在Windows环境中,我们一般使用TortoiseSVN来搭建svn环境.在Mac环境下,由于Mac自带了svn的服务器端和客户端功能,所以我们可以在不装任何第三方软件的前提下使用svn功能,不过还需做一下简单的配置. 我们首先来看下,如何在Mac环境下搭建svn服务器端环境. 一.创建代码仓库,用来存储客户端所上传的代码 我先在/User/apple目录下新建一个svn目录,以后可以在svn目录下创建多个仓库目录 打开终端,创建一个mycode仓库,输入指令: svnadmin create

  • 在Mac中配置Python虚拟环境过程解析

    如何在Mac中配置Python虚拟环境 1.安装virtualenv pip3 install virtualenv 2.安装virtualenvwrapper pip3 install virtualenv 3.配置.bashrc文件,没有的话在根目录"~"下创建一个 cd ~ vim .bashrc 定义Python安装路径(可通过which is python3查询) export VIRTUALENVWRAPPER_PYTHON='/usr/local/bin/python3

  • 如何在Mac系统使用Visual Studio Code运行Python

    之前一直用pycharm开发python程序,这个ide编辑器确实香,一点毛病都没有,唯一毛病就是太贵了.也看到很多人在用免费.开源的Visual Studio Code,巨硬开发的这个ide也号称宇宙最强ide,不知道我用了会不会变强.下面是配置并运行python的过程,记录一下,安装就不说了,直接官网下载安装包安装就ok了. 步骤 1.安装中文包插件 安装完,重启,发现就换成中文界面了. 2.安装运行插件 你导入.py文件的时候,会提示你安装一个python扩展,我直接同意了.然后在安装一个

  • 在MAC上搭建python数据分析开发环境

    最近工作转型到数据开发领域,想在本地搭建一个数据开发环境.自己有三年python开发经验,马上想到使用numpy.scipy.sklearn.pandas搭建一套数据开发环境. ubuntu的环境,百度中文章比较多,搭建起来非常顺利.MAC环境的资料比较少,百度出来的,已经不对了,那我就来补充一篇吧. MAC自带python,python的安装我就不多说了. 安装pip 我喜欢用pip安装python库,非常方便,pip的安装只能用源码了. #下载源代码 https://pypi.python.

  • MAC平台基于Python Appium环境搭建过程图解

    前言 最近笔者要为python+appium课程做准备,mac在2019年重新安装了一次系统,这次重新在mac下搭建appium环境,刚好顺带写个文稿给大家分享分享搭建过程. 一.环境和所需软件概述 1.1 目前环境: MacOS(10.15.3) 1.2 所需软件: jdk-8u91-macosx-x64.dmg (jdk1.8及以上版本应该都可以) android-sdk_r24.4.1-macosx.zip (mac版本的android-sdk) genymotion-3.0.4.dmg

  • 如何在Mac上通过docker配置PHP开发环境

    使用docker-compose配置开发环境 一般一个基本的PHP开发环境包括PHP.PHP-FPM.WEB服务器.MySQL数据库,另外还会有Redis或memcache等相关NoSQL服务.我主要是通过docker-compose来配置服务. 什么是docker-compose docker-compose是一个通过YAML文件来定义项目,项目中包含单个或多个容器服务.一般配置文件名为:docker-compose.yml. 目录结构 你可以按自己的喜好组织项目,下面是我用的方法,app 目

  • 解决Mac下使用python的坑

    操作系统:macOS High Sierra 10.13.3 Python3.6 因为此版本自带python2.7,就下载并安装了anaconda2的版本,结果使用的时候系统自带的python和anaconda里的python冲突,也就是装包的时候只在一处装了,另一处却不能使用.因此要配置环境变量,替代到系统自带的版本. python2.7总会发生中文字体乱码的情况,果断放弃,准备使用anaconda3. 1.安装anaconda3 在官网下载,并安装,直接都是下一步. 2.修改环境变量 在命令

随机推荐