最近,边肖发现在服务器上做压力测试时,服务器和客户端之间的数据传输是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