当前位置:首页 > 房产信息

repeated Python序列化protobuf中的repeated数据

最近,边肖发现在服务器上做压力测试时,服务器和客户端之间的数据传输是protobuf格式的。压力测试时需要Python来序列化请求的protobuf数据。以前有大神做过这个工作,按照大神的脚步一步一步往下走。边肖发现他的项目有一点不同:protobuf有一个重复的修饰符,用这个修饰符序列化数据有一点技巧。边肖会在这里与你分享。

注:关于protobuf(Google Protocol Buffer)的基本信息,可以参考昨天另一位亲爱的朋友发来的文章:protobuf的秘密。

1.关于在protobuf中重复

Repeated是protobuf中的限定修饰语,字面意思是“repeated”。其实是用来指定某个字段可以容纳多个相同类型的数据(当然是0或者1),相当于C++中的vector或者Java中的List。protobuf中重复类型数据的定义非常简单:

messagePerson{

required string name = 1;

required int 32 age = 2;

}

messageGroup{

repeatedPerson

}

相当于C++中的向量:

classPerson

{

公共:

// balabala...

私人:

stringname

intage

}

vector<。Person>。vGroup

二、Python如何序列化重复修改的数据

在使用Python操作protobuf之前,我们需要编译protobuf文件,让它生成一个. py文件,在操作之前把这个文件引入到我们的项目中。protobuf文件的编译非常简单,只需在命令行执行以下命令:

protoc.exe-我=。/ - python_out=。/ yourprotofile.proto

执行后,相应的。py文件将在当前执行的目录中生成(当然,输出路径可以自己指定):

yourprotofile_pb2.py

导入生成的。py文件导入到项目中,你可以使用Python来操作这个protobuf。

先说如何序列化重复修饰的数据。至于反复修改的数据,发现边肖实施过程中有两种情况需要处理,否则会遇到非常棘手的问题(别问我为什么知道,都是眼泪)。

1.1.repeated修改消息的情况

下图是边肖最近遇到的一个. proto文件:

可以看到,在ClientRequestBody的消息体中,数据是用重复修饰符修饰的。在这种情况下,在Python中序列化时,您需要做以下事情:

A.对于复合类型(消息),调用add方法初始化一个新实例;

B.为实例中的每个元素赋值。

可以用伪代码表示如下:

importmyproto_pb2

#初始化ClientRequestBody实例

clientRequestBody = myproto_pb2。ClientRequestBody()

#因为数据是一个复合类型,这里需要调用add()方法来实例化一个数据。

my data = ClientRequestBody . data . add()

#为我的数据中的每个元素赋值

mydata.py = balabala_1

mydata.word = balabala_2

...

这就完成了Python对复合peotobuf数据的操作。边肖认为这是一种普遍的方法。第二天遇到另一个项目的protobuf,直接套用上述方法,发现报错。查了一下资料,知道不是所有类型都可以用上面的方法结算,这是第二种情况。

2 .重复修改标准数据类型

又一个。proto文件如下所示:

你可以看到proto文件很简单,ClientRequestBody中只有一个int32类型(相当于C++或者Java中的int类型)是用repeated修改的。边肖根据上述方法调用add()方法后,系统会报告一个错误。为什么报错?

事实证明,如果我们想要按照数据类型进行操作,我们需要实例化这个数据类型;但是,如果要操作的数据是一个基本的数据类型(比如本例中的int32),那么我们可以用append()方法直接追加新元素。伪码表示如下:

importmyproto_pb2

#同样,首先初始化ClientRequestBody实例

clientRequestBody = myproto_pb2。ClientRequestBody()

#因为是基本数据类型,这里不需要实例化,直接追加数据即可

clientRequestBody.ids.append( 1)

clientRequestBody.ids.append( 2)

...

#如果ids所需的数据类型是列表,请使用extend()方法

#有关详细信息,请参见extend()和append()方法之间的区别

client RequestBody . ids . extend(list 1)

client RequestBody . ids . extend(list 2)

...

以上是边肖近日在压力测试中遇到的问题及解决方法,希望能给大家提供一些帮助。

关于以上两种序列化情况,如果有更好的解决方案或者有其他问题,请在消息区留言。另外,也欢迎大家有任何关于protobuf的问题留言,一起学习。

看完了,赞一句~嗯嗯。

1.《repeated Python序列化protobuf中的repeated数据》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。

2.《repeated Python序列化protobuf中的repeated数据》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。

3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/fangchan/1649257.html

上一篇

睢宁租房信息 重磅新规!睢宁租房的不办这件事,将被处罚!马上就实施!

下一篇

吴丽君 《双面胶》已经过去13年,现实的主人公原型,他们一家啥结局?

地图舌的治疗方法 宝宝地图舌莫担心,小儿推拿有方法

  • 地图舌的治疗方法 宝宝地图舌莫担心,小儿推拿有方法
  • 地图舌的治疗方法 宝宝地图舌莫担心,小儿推拿有方法
  • 地图舌的治疗方法 宝宝地图舌莫担心,小儿推拿有方法

学画汽车 如何学会画帅的汽车手绘图,给你个顶级简单的方法

  • 学画汽车 如何学会画帅的汽车手绘图,给你个顶级简单的方法
  • 学画汽车 如何学会画帅的汽车手绘图,给你个顶级简单的方法
  • 学画汽车 如何学会画帅的汽车手绘图,给你个顶级简单的方法

宝宝地图舌是什么原因 宝宝地图舌莫担心,小儿推拿有方法

  • 宝宝地图舌是什么原因 宝宝地图舌莫担心,小儿推拿有方法
  • 宝宝地图舌是什么原因 宝宝地图舌莫担心,小儿推拿有方法
  • 宝宝地图舌是什么原因 宝宝地图舌莫担心,小儿推拿有方法

文件名的命名规则 提升效率的4条「文件命名」黄金规则,Office都适用

  • 文件名的命名规则 提升效率的4条「文件命名」黄金规则,Office都适用
  • 文件名的命名规则 提升效率的4条「文件命名」黄金规则,Office都适用
  • 文件名的命名规则 提升效率的4条「文件命名」黄金规则,Office都适用
检测硬盘坏道 怎样检测硬盘坏道?下面五个方法教给你

检测硬盘坏道 怎样检测硬盘坏道?下面五个方法教给你

在硬盘可能出现的诸多问题中,硬盘的坏轨是一种难以解决的难题。很多人第一时间无法判断硬盘是否有坏轨,以为只是普通硬盘故障,于是反复使用硬盘或者使用第三方工具修复硬盘,才发现硬盘故障加重,数据损坏更多。那么我们用什么来检测硬盘是否有坏轨呢?  1.声音。硬盘工作时突然从正常的摩擦声变成奇怪的声...

第七次全国人口普查主要数据将公布 事件详细经过!

国务院新闻办公室定于2021年5月11日10时举行新闻发布会,请国务院第七次全国人口普查领导小组副组长、国家统计局局长宁吉喆,国务院第七次全国人口普查领导小组办公室主任、国家统计局副局长李晓超,国务院第七次全国人口普查领导小组办公室副主任、国家统计局总统计师曾玉平,国务院第七次全国人口普查领导小组办公室副主任、国家统计局人口和就业统计司司长张毅介绍第七次全国人口...

莫吉托做法 一杯莫吉托的制作方法

莫吉托做法 一杯莫吉托的制作方法

莫吉托的制作视频 莫吉托制作配方 成分:薄荷叶,绿柠檬,百加得糖 做法:薄荷叶7/8对,半个柠檬切成4块,挤在水里,放入摇壶 一袋糖,朗姆酒45c柠檬汁15c,加冰摇匀 放在一个有一点薄荷叶的杯子里。...

快刷 《圣歌》快速刷等级方法分享

快刷 《圣歌》快速刷等级方法分享

《赞美诗》里很多玩家现在都在不断的刷材质和配件,但是很多玩家都不确定快速刷的方法是什么。今天,边肖将为您带来玩家“阿松银月”分享的快速刷牙方法,希望对大家有所帮助。  快速刷级法分享 刷满级的快速方法是无限快匹配,不做任何任务。如果想快速上升到满级,可以无限快速匹配。...