溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何在mac環(huán)境中用python處理protobuf

發(fā)布時(shí)間:2020-09-11 12:58:52 來(lái)源:腳本之家 閱讀:187 作者:公眾號(hào)python學(xué)習(xí)開(kāi)發(fā) 欄目:開(kāi)發(fā)技術(shù)

這篇文章主要介紹了如何在mac環(huán)境中用python處理protobuf,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

安裝

brew install protobuf

然后再安裝protobuf需要的依賴

brew install autoconf automake libtool

驗(yàn)證是否安裝成功

protoc –version

protobuf3語(yǔ)法介紹

1.字段前取消了required和optional兩個(gè)關(guān)鍵字,目前可用的只有repeated關(guān)鍵字。

2.不可以現(xiàn)設(shè)置默認(rèn)值了。

  a.string默認(rèn)為空串

  b.枚舉默認(rèn)為第一個(gè)枚舉定義的第一個(gè)值。并且必須是0,必須有有一個(gè)0值,我們可以用這個(gè)0值作為默認(rèn)值。
這個(gè)零值必須為第一個(gè)元素,為了兼容proto2語(yǔ)義,枚舉類的第一個(gè)值總是默認(rèn)值。

  c.bytes默認(rèn)為空bytes

  d.bool默認(rèn)為false

  e.數(shù)字類型默認(rèn)為0

3.protoType類型如下:

double、float、int32、int64、uint32、uint64、sint32、sint64、fixed32、fixed64、sfixed32、sfixed64、bool、string、bytes

4、分配標(biāo)識(shí)號(hào)

正如你所見(jiàn),在消息定義中,每個(gè)字段都有唯一的一個(gè)數(shù)字標(biāo)識(shí)符。這些標(biāo)識(shí)符是用來(lái)在消息的二進(jìn)制格式中識(shí)別各個(gè)字段的,一旦開(kāi)始使用就不能夠再改變。注:[1,15]之內(nèi)的標(biāo)識(shí)號(hào)在編碼的時(shí)候會(huì)占用一個(gè)字節(jié)。[16,2047]之內(nèi)的標(biāo)識(shí)號(hào)則占用2個(gè)字節(jié)。所以應(yīng)該為那些頻繁出現(xiàn)的消息元素保留 [1,15]之內(nèi)的標(biāo)識(shí)號(hào)。切記:要為將來(lái)有可能添加的、頻繁出現(xiàn)的標(biāo)識(shí)號(hào)預(yù)留一些標(biāo)識(shí)號(hào)。

最小的標(biāo)識(shí)號(hào)可以從1開(kāi)始,最大到2^29 - 1, or 536,870,911。不可以使用其中的[19000-19999]( (從FieldDescriptor::kFirstReservedNumber 到 FieldDescriptor::kLastReservedNumber))的標(biāo)識(shí)號(hào), Protobuf協(xié)議實(shí)現(xiàn)中對(duì)這些進(jìn)行了預(yù)留。如果非要在.proto文件中使用這些預(yù)留標(biāo)識(shí)號(hào),編譯時(shí)就會(huì)報(bào)警。同樣你也不能使用早期保留的標(biāo)識(shí)號(hào)。

指定字段規(guī)則

所指定的消息字段修飾符必須是如下之一:

  • singular:一個(gè)格式良好的消息應(yīng)該有0個(gè)或者1個(gè)這種字段(但是不能超過(guò)1個(gè))。
  • repeated:在一個(gè)格式良好的消息中,這種字段可以重復(fù)任意多次(包括0次)。重復(fù)的值的順序會(huì)被保留。

在proto3中,repeated的標(biāo)量域默認(rèn)情況蝦使用packed。

編寫(xiě)protoco文件,addressbook.proto。

syntax = "proto3"; //正在使用proto3語(yǔ)法,如果你沒(méi)有指定這個(gè),編譯器會(huì)使用proto2
package tutorial;

//*.proto文件中數(shù)據(jù)類型可以分為兩大類:
//復(fù)合數(shù)據(jù)類型包括:枚舉和message類型
//標(biāo)準(zhǔn)數(shù)據(jù)類型包含:整型,浮點(diǎn),字符串等

message AddressBook {
 //repeated: 該字段可以重復(fù)任意次數(shù),包括0次。重復(fù)數(shù)據(jù)的順序?qū)?huì)保存在protocol buffer中,將這個(gè)字段想象成一個(gè)可以自動(dòng)設(shè)置size的數(shù)組就可以了。
 repeated Person people = 1;
}

message Person {
 //每個(gè)字段有一種類型
 //該Number是用來(lái)標(biāo)記該字段在序列化后的二進(jìn)制數(shù)據(jù)中所在的field,
 //每個(gè)字段的Number在message內(nèi)部都是獨(dú)一無(wú)二的。也不能進(jìn)行改變,否則數(shù)據(jù)就不能正確的解包
 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=./ 

創(chuàng)建一個(gè)解析文件

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() # 生成字節(jié)數(shù)組
str_result = address_book.ParseFromString(serializeTostring) # 轉(zhuǎn)為字符串
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])

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持億速云。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI