最近,邊肖發(fā)現(xiàn)在服務(wù)器上做壓力測(cè)試時(shí),服務(wù)器和客戶(hù)端之間的數(shù)據(jù)傳輸是protobuf格式的。壓力測(cè)試時(shí)需要Python來(lái)序列化請(qǐng)求的protobuf數(shù)據(jù)。以前有大神做過(guò)這個(gè)工作,按照大神的腳步一步一步往下走。邊肖發(fā)現(xiàn)他的項(xiàng)目有一點(diǎn)不同:protobuf有一個(gè)重復(fù)的修飾符,用這個(gè)修飾符序列化數(shù)據(jù)有一點(diǎn)技巧。邊肖會(huì)在這里與你分享。
注:關(guān)于protobuf(Google Protocol Buffer)的基本信息,可以參考昨天另一位親愛(ài)的朋友發(fā)來(lái)的文章:protobuf的秘密。
1.關(guān)于在protobuf中重復(fù)
Repeated是protobuf中的限定修飾語(yǔ),字面意思是“repeated”。其實(shí)是用來(lái)指定某個(gè)字段可以容納多個(gè)相同類(lèi)型的數(shù)據(jù)(當(dāng)然是0或者1),相當(dāng)于C++中的vector或者Java中的List。protobuf中重復(fù)類(lèi)型數(shù)據(jù)的定義非常簡(jiǎn)單:
messagePerson{
required string name = 1;
required int 32 age = 2;
}
messageGroup{
repeatedPerson
}
相當(dāng)于C++中的向量:
classPerson
{
公共:
// balabala...
私人:
stringname
intage
}
vector<。Person>。vGroup
二、Python如何序列化重復(fù)修改的數(shù)據(jù)
在使用Python操作protobuf之前,我們需要編譯protobuf文件,讓它生成一個(gè). py文件,在操作之前把這個(gè)文件引入到我們的項(xiàng)目中。protobuf文件的編譯非常簡(jiǎn)單,只需在命令行執(zhí)行以下命令:
protoc.exe-我=。/ - python_out=。/ yourprotofile.proto
執(zhí)行后,相應(yīng)的。py文件將在當(dāng)前執(zhí)行的目錄中生成(當(dāng)然,輸出路徑可以自己指定):
yourprotofile_pb2.py
導(dǎo)入生成的。py文件導(dǎo)入到項(xiàng)目中,你可以使用Python來(lái)操作這個(gè)protobuf。
先說(shuō)如何序列化重復(fù)修飾的數(shù)據(jù)。至于反復(fù)修改的數(shù)據(jù),發(fā)現(xiàn)邊肖實(shí)施過(guò)程中有兩種情況需要處理,否則會(huì)遇到非常棘手的問(wèn)題(別問(wèn)我為什么知道,都是眼淚)。
1.1.repeated修改消息的情況
下圖是邊肖最近遇到的一個(gè). proto文件:
可以看到,在ClientRequestBody的消息體中,數(shù)據(jù)是用重復(fù)修飾符修飾的。在這種情況下,在Python中序列化時(shí),您需要做以下事情:
A.對(duì)于復(fù)合類(lèi)型(消息),調(diào)用add方法初始化一個(gè)新實(shí)例;
B.為實(shí)例中的每個(gè)元素賦值。
可以用偽代碼表示如下:
importmyproto_pb2
#初始化ClientRequestBody實(shí)例
clientRequestBody = myproto_pb2。ClientRequestBody()
#因?yàn)閿?shù)據(jù)是一個(gè)復(fù)合類(lèi)型,這里需要調(diào)用add()方法來(lái)實(shí)例化一個(gè)數(shù)據(jù)。
my data = ClientRequestBody . data . add()
#為我的數(shù)據(jù)中的每個(gè)元素賦值
mydata.py = balabala_1
mydata.word = balabala_2
...
這就完成了Python對(duì)復(fù)合peotobuf數(shù)據(jù)的操作。邊肖認(rèn)為這是一種普遍的方法。第二天遇到另一個(gè)項(xiàng)目的protobuf,直接套用上述方法,發(fā)現(xiàn)報(bào)錯(cuò)。查了一下資料,知道不是所有類(lèi)型都可以用上面的方法結(jié)算,這是第二種情況。
2 .重復(fù)修改標(biāo)準(zhǔn)數(shù)據(jù)類(lèi)型
又一個(gè)。proto文件如下所示:
你可以看到proto文件很簡(jiǎn)單,ClientRequestBody中只有一個(gè)int32類(lèi)型(相當(dāng)于C++或者Java中的int類(lèi)型)是用repeated修改的。邊肖根據(jù)上述方法調(diào)用add()方法后,系統(tǒng)會(huì)報(bào)告一個(gè)錯(cuò)誤。為什么報(bào)錯(cuò)?
事實(shí)證明,如果我們想要按照數(shù)據(jù)類(lèi)型進(jìn)行操作,我們需要實(shí)例化這個(gè)數(shù)據(jù)類(lèi)型;但是,如果要操作的數(shù)據(jù)是一個(gè)基本的數(shù)據(jù)類(lèi)型(比如本例中的int32),那么我們可以用append()方法直接追加新元素。偽碼表示如下:
importmyproto_pb2
#同樣,首先初始化ClientRequestBody實(shí)例
clientRequestBody = myproto_pb2。ClientRequestBody()
#因?yàn)槭腔緮?shù)據(jù)類(lèi)型,這里不需要實(shí)例化,直接追加數(shù)據(jù)即可
clientRequestBody.ids.append( 1)
clientRequestBody.ids.append( 2)
...
#如果ids所需的數(shù)據(jù)類(lèi)型是列表,請(qǐng)使用extend()方法
#有關(guān)詳細(xì)信息,請(qǐng)參見(jiàn)extend()和append()方法之間的區(qū)別
client RequestBody . ids . extend(list 1)
client RequestBody . ids . extend(list 2)
...
以上是邊肖近日在壓力測(cè)試中遇到的問(wèn)題及解決方法,希望能給大家提供一些幫助。
關(guān)于以上兩種序列化情況,如果有更好的解決方案或者有其他問(wèn)題,請(qǐng)?jiān)谙^(qū)留言。另外,也歡迎大家有任何關(guān)于protobuf的問(wèn)題留言,一起學(xué)習(xí)。
看完了,贊一句~嗯嗯。
1.《repeated Python序列化protobuf中的repeated數(shù)據(jù)》援引自互聯(lián)網(wǎng),旨在傳遞更多網(wǎng)絡(luò)信息知識(shí),僅代表作者本人觀點(diǎn),與本網(wǎng)站無(wú)關(guān),侵刪請(qǐng)聯(lián)系頁(yè)腳下方聯(lián)系方式。
2.《repeated Python序列化protobuf中的repeated數(shù)據(jù)》僅供讀者參考,本網(wǎng)站未對(duì)該內(nèi)容進(jìn)行證實(shí),對(duì)其原創(chuàng)性、真實(shí)性、完整性、及時(shí)性不作任何保證。
3.文章轉(zhuǎn)載時(shí)請(qǐng)保留本站內(nèi)容來(lái)源地址,http://f99ss.com/fangchan/1649257.html