protobuf反射機制的應用 pb轉成map

2021-10-04 10:40:21 字數 2262 閱讀 9560

各個類以及介面說明:

message

person是自定義的pb型別,繼承自message. messagelite作為message基類,更加輕量級一些。 通過message的兩個介面getdescriptor/getreflection,可以獲取該型別對應的descriptor/reflection。

descriptor

獲取所有欄位的個數:int field_count() const獲取單個字段描述型別fielddescriptor的介面有很多個,例如

const fielddescriptor* field(int index) const;//根據定義順序索引獲取

const fielddescriptor* findfieldbynumber(int number) const;//根據tag值獲取

const fielddescriptor* findfieldbyname(const string& name) const;//根據field name獲取

fielddescriptor

fielddescriptor描述message中的單個字段,例如欄位名,字段屬性(optional/required/repeated)等。 對於proto定義裡的每種型別,都有一種對應的c++型別,例如:

enum cpptype
獲取型別的label屬性:

enum label
獲取欄位的名稱:const string& name() const;

reflection

reflection主要提供了動態讀寫pb欄位的介面,對pb物件的自動讀寫主要通過該類完成。 對每種型別,reflection都提供了乙個單獨的介面用於讀寫字段對應的值。 例如對於讀操作:

virtual int32  getint32 (const message& message,

const fielddescriptor* field) const = 0;

virtual int64 getint64 (const message& message,

const fielddescriptor* field) const = 0;

特殊的,對於列舉和巢狀的message:

virtual const enumvaluedescriptor* getenum(

const message& message, const fielddescriptor* field) const = 0;

// see mutablemessage() for the meaning of the "factory" parameter.

virtual const message& getmessage(const message& message,

const fielddescriptor* field,

messagefactory* factory = null) const = 0;

對於寫操作也是類似的介面,例如setint32/setint64/setenum等。

int pb2map(const google::protobuf::message& message,

std::map* map)

#define case_field_type_enum()

case google::protobuf::fielddescriptor::cpptype_enum:

#define case_field_type_string()

case google::protobuf::fielddescriptor::cpptype_string:

const google::protobuf::descriptor* descriptor = message.getdescriptor();

const google::protobuf::reflection* reflection = message.getreflection();

for (int i = 0; i < descriptor->field_count(); ++i)

switch (field->cpp_type())

} else

}return cs_ok;

protobuf c++ api

protobuf反射機制

參考 google protocol buffers protobuf 是一款非常優秀的庫,它定義了一種緊湊的可擴充套件二進位制訊息格式,特別適合網路資料傳輸。它為多種語言提供 binding,大大方便了分布式程式的開發,讓系統不再侷限於用某一種語言來編寫。在網路程式設計中使用 protobuf 需...

ProtoBuf 反射詳解

protocol buffer 簡稱 protobuf,是用於結構化資料序列化的靈活 高效 自動的方法,又如 xml,不過它更小 更快 也更簡單。你可以定義自己的資料結構,然後使用 生成器生成的 來讀寫這個資料結構。你甚至可以在無需重新部署程式的情況下更新資料結構。本文主要介紹 protobuf 裡...

Protobuf反射功能

include include include include include person.pb.h using namespace std string package typedef void callbackfunc const string type name,google protobu...