protobuf反射機制

2021-07-15 02:23:57 字數 1828 閱讀 6485

參考:

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

在網路程式設計中使用 protobuf 需要解決兩個問題:

解決方法:

長度:在每個訊息頭新增固定長度的length header.

型別:protobuf 打包的資料沒有自帶型別資訊。但protobuf 對此有內建的支援,可以使用protobuf反射機制。

//必須的標頭檔案

//type_name來自於訊息傳送端生成的。

typedef test::person t;

string type_name = t::descriptor()->full_name(); //獲取型別名稱:test.person

cout <<

"type name is "

<

可復用介面:

#include

#include

#include

#include

<

string

>

using std::shared_ptr;

using std::string;

/** protobuf反射

*/shared_ptr<:protobuf>

::message

> parsefrommsg(const string

& type_name, const string

& message)

主要依賴 google::protobuf::reflection 物件

需要 *.proto 檔案中的欄位名字和型別。

const google::protobuf

::reflection

*reflection = new_obj->getreflection();

const google::protobuf

::descriptor

*descriptor = google::protobuf

::descriptorpool

::generated_pool()->findmessagetypebyname(type_name);

// 不管發的是什麼型別,如果能確定型別當中一定有name(id,email),而且name定義的型別是string(int_32,string),那麼就可以直接獲取到

const google::protobuf

::fielddescriptor

* rmes_field ;

rmes_field = descriptor->findfieldbyname("id");

cout << reflection->getint32(*new_obj, rmes_field) << endl;

rmes_field = descriptor->findfieldbyname("name");

//cout << reflection->getstring(*new_obj, rmes_field) << endl;

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...

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

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