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

作者:公众号python学习开发 时间:2021-02-26 08:42:06 

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

来源:https://www.cnblogs.com/c-x-a/p/11865369.html

标签:mac,python,处理,protobuf
0
投稿

猜你喜欢

  • 纯ASP结合VML生成完美图-饼图

    2010-05-11 16:49:00
  • python递归实现快速排序

    2023-08-26 22:46:27
  • python中的&&及||的实现示例

    2022-02-06 19:53:42
  • Bootstrap每天必学之响应式导航、轮播图

    2023-08-15 03:29:45
  • SQL SERVER EXPRESS 常见问题及解决办法

    2008-09-13 19:07:00
  • 通过事务日志解决SQL Server常见四大故障(一)

    2009-03-25 13:46:00
  • python编程中简洁优雅的推导式示例详解

    2021-02-12 01:43:56
  • python3将视频流保存为本地视频文件

    2023-07-26 12:14:45
  • 交互设计:简单

    2011-08-27 16:46:27
  • HTTP中header头部信息详解

    2023-06-11 23:33:17
  • NumPy实现多维数组中的线性代数

    2021-03-30 09:59:08
  • 用python做一个搜索引擎(Pylucene)的实例代码

    2023-06-30 22:12:40
  • python之线程通过信号pyqtSignal刷新ui的方法

    2022-01-03 22:28:45
  • Python 统计Jira的bug 并发送邮件功能

    2021-03-24 05:44:24
  • 跟老齐学Python之关于循环的小伎俩

    2022-07-20 07:03:36
  • 如何将Python列表转换为字符串

    2023-11-02 12:54:27
  • JavaScript错误处理

    2023-09-23 08:26:37
  • 深入了解NumPy 高级索引

    2023-07-02 05:22:51
  • MSXML2家族探秘

    2008-03-03 12:35:00
  • python线程池ThreadPoolExecutor,传单个参数和多个参数方式

    2022-01-20 19:49:45
  • asp之家 网络编程 m.aspxhome.com