protobuf c++編程筆記
字段內(nèi)容的定義
//文件名:addressbook.proto
syntax = "proto2";//proto版本
//.proto文件新增一個(gè)可選的package聲明符,用來(lái)防止不同的消息類型有命名沖突。
//包的聲明符會(huì)根據(jù)使用語(yǔ)言的不同影響生成的代碼。對(duì)于C++,產(chǎn)生的類會(huì)被包裝在C++的命名空間中。
package tutorial;package聲明符
message Person {
required string name = 1;//姓名,= 1 二進(jìn)制編碼中使用的唯一 “標(biāo)記”
required int32 id = 2;//ID
optional string email = 3;//email
enum PhoneType {//枚舉消息類型
MOBILE = 0;//proto3版本中,首成員必須為0,成員不應(yīng)有相同的值
HOME = 1;
WORK = 2;
}
//
message PhoneNumber {
required string number = 1;
optional PhoneType type = 2 [default = HOME];
}
repeated PhoneNumber phones = 4;//phones為數(shù)組
}
message AddressBook {
repeated Person people = 1;
}
修飾符
- required 必須提供該字段的值,否則消息會(huì)被認(rèn)為是”未初始化的“
- optional
表示屬性值為可選項(xiàng),不指定使用默認(rèn)值。int和char數(shù)據(jù)類型默認(rèn)為0,string默認(rèn)為空,bool默認(rèn)為false,嵌套message默認(rèn)為構(gòu)造,枚舉為第一個(gè)
- repeated 表示該屬性為重復(fù)字段,可看走是動(dòng)態(tài)數(shù)組,類似于c++中的vector
如果為optional屬性,發(fā)送端沒(méi)有包含該屬性,則接收端在解析式采用默認(rèn)值。對(duì)于默認(rèn)值,如果已設(shè)置默認(rèn)值,則采用默認(rèn)值,如果未設(shè)置,則類型特定的默認(rèn)值為使用,例如string的默認(rèn)值為”“。
字段類型
- package
相當(dāng)于namespace
- message
相當(dāng)于clas
- name
相當(dāng)于屬性值
引用方式
- 類成員函數(shù)變量
package::message.方法()
- 標(biāo)準(zhǔn)meaasge方法
1.bool IsInitialized() const;: 檢查是否已設(shè)置所有必填 required 字段
2.string DebugString() const;: 返回 message 的人類可讀表達(dá),對(duì)調(diào)試特別有用
3.void CopyFrom(const Person& from);用給定的 message 的值覆蓋 message
4.void Clear();: 將所有元素清除回 empty 狀態(tài)
不同字段的方法
1)optional修飾的基本類型:
- set_屬性名(val) :初始化修改屬性值;
- 屬性名():獲取屬性值,只讀模式,返回類型是::google::protobuf::int64;
2)optional修飾的對(duì)象類型:
- 屬性名():返回只讀的屬性類型對(duì)象的引用,屬性類型是指pb中定義的對(duì)象;
- mutable_屬性名():返回可修改的屬性類型對(duì)象的指針,屬性類型是指pb中定義的對(duì)象;
- set_屬性名():初始化設(shè)置字段值
3)repeated修飾的基本類型:
- add_屬性名(val):向?qū)傩约现刑砑釉兀?/li>
- 屬性名_size():獲取集合大??;
- 屬性名(i):返回集合中某一個(gè)元素,返回類型::google::protobuf::int64;
- 屬性名():返回只讀的整個(gè)集合的引用,返回的集合類型是const ::google::protobuf::RepeatedField< ::google::protobuf::int64 >&,可以使用iterator來(lái)迭代遍歷,可用于修改;
- mutable_屬性():返回可修改的整個(gè)集合的指針,返回的集合類型::google::protobuf::RepeatedField< ::google::protobuf::int64 >*,可以使用iterator來(lái)迭代遍歷,可用于修改;
- set_屬性名(int,x):設(shè)置repeated中元素的值
4)repeated修飾的對(duì)象類型:
- add_屬性名():返回可修改的屬性類型對(duì)象的指針(集合中的一個(gè)元素),屬性類型是指pb中定義的對(duì)象;
- 屬性名_size():獲取集合大?。?br />
屬性名(i):返回集合中某一個(gè)元素,返回的是只讀的屬性類型對(duì)象的引用,屬性類型是指pb中定義的對(duì)象;
- mutable_屬性名(i):返回集合中某一個(gè)元素,返回的是可修改的屬性類型對(duì)象的指針,屬性類型是指pb中定義的對(duì)象;
- 屬性名():返回只讀的整個(gè)集合的引用,集合類型是const ::google::protobuf::RepeatedPtrField< pb定義的對(duì)象>& XXX const;,可以使用iterator來(lái)迭代遍歷;
- mutable_屬性名():返回可修改的整個(gè)集合的指針,集合類型是::google::protobuf::RepeatedPtrField< pb定義的對(duì)象>*,可以使用iterator來(lái)迭代遍歷;
序列化
- required字段需要初始化,可以通過(guò)IsInitialized來(lái)檢查是否完成message對(duì)象的初始化
- SerializedAsString(),SerializedToString(std::string* output) 把meaage編碼進(jìn)output
- SerializedToArray(void*,int)把message編碼進(jìn)數(shù)組buff
- SerializedToOstream(ostream*)把message編碼到輸出流
- ByteSize()獲取二進(jìn)制字節(jié)序的大小,可用于初始化存放容器
反序列化
- ParseFromString(std::string& data) 把data解碼到message
- ParseFromArray(char* buf,int size)把buf解碼到message,效率比第一個(gè)快很多
- ParseFromIstream(istream*)從istream輸入流解碼到message
- has_xxx()用于檢查相應(yīng)字段是否存在數(shù)據(jù)
- xxx_size()用于確定repeated字段是否存在,0表示未序列化
總結(jié)
本篇文章就到這里了,希望能給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
C/C++詳解實(shí)現(xiàn)二層轉(zhuǎn)發(fā)
數(shù)據(jù)鏈路層是開放系統(tǒng)互連 (OSI) 模型中的第二層,該層用于通過(guò) LAN 等單一網(wǎng)絡(luò)進(jìn)行通信的節(jié)點(diǎn),第二層數(shù)據(jù)包不能從一個(gè)網(wǎng)絡(luò)傳輸?shù)搅硪粋€(gè)網(wǎng)絡(luò)。而二層轉(zhuǎn)發(fā)是根據(jù)報(bào)文的目的MAC直接進(jìn)行轉(zhuǎn)發(fā),轉(zhuǎn)發(fā)過(guò)程中不用對(duì)報(bào)文的頭部做任何的修改2022-05-05
計(jì)時(shí)器的time_t和clock_t 的兩種實(shí)現(xiàn)方法(推薦)
下面小編就為大家?guī)?lái)一篇計(jì)時(shí)器的time_t和clock_t 的兩種實(shí)現(xiàn)方法(推薦)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-10-10
C++實(shí)現(xiàn)圖書館管理系統(tǒng)源碼
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)圖書館管理系統(tǒng)源碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03

