1. 程式人生 > >google protobuf 訊息反射

google protobuf 訊息反射

Google Protocol Buffer( 簡稱 Protobuf) 是 Google 公司內部的混合語言資料標準,他們用於 RPC 系統和持續資料儲存系統。

Protocol Buffers 是一種輕便高效的結構化資料儲存格式,可以用於結構化資料序列化,或者說序列化。它很適合做資料儲存或 RPC 資料交換格式。可用於通訊協議、資料儲存等領域的語言無關、平臺無關、可擴充套件的序列化結構資料格式,並且提供了 多種語言語言的 API,比如C++、Java、Python等

使用C++的情況下,一般使用下面的方法來實現訊息的反射:

google::protobuf::Message* CreateMessage(const std::string& typeName)
{
google::protobuf::Message* message = NULL;
const google::protobuf::Descriptor* descriptor = google::protobuf::DescriptorPool::generated_pool()->FindMessageTypeByName(typeName);
if (descriptor)
{
const google::protobuf::Message* prototype = google::protobuf::MessageFactory::generated_factory()->GetPrototype(descriptor);
if (prototype)
{
message = prototype->New();
}
}
return message;
}

我在專案中也是這樣去實現網路訊息的自動派發,ProtoBuf版本是2.6.1。

但是前不久,我突然發現某些Message卻無法動態創建出來。
經我測試發現,建立不出來的Message集中在某些特定的*.proto檔案中,並且我每次開服,建立不出來的Message還不一樣,經我反覆實驗,發現proto定義時枚舉出現了衝突現象,如下:

同一名稱空間下的兩個列舉
enum AAA
{
aaa = 0;
}

enum BBB
{
aaa = 0;
}

這樣的定義不允許的 ,如果這樣的兩個定義放在同一個*.proto檔案中 Protoc生成程式碼時會提示
但是當 AAA和BBB不在同一個*.proto檔案中時,Protoc是不檢測衝突的 這點要格外注意
如果出現重名現象,會導致某些協議沒有註冊 Descriptor 進而無法動態生成message物件

相關推薦

google protobuf 訊息反射

Google Protocol Buffer( 簡稱 Protobuf) 是 Google 公司內部的混合語言資料標準,他們用於 RPC 系統和持續資料儲存系統。 Protocol Buffers 是一種輕便高效的結構化資料儲存格式,可以用於結構化資料序列化,

Google protobuf訊息巢狀c++實現

protobuf3.1.0的安裝見:https://blog.csdn.net/mircosheng/article/details/70141704 安裝完protobuf後,新建.proto檔案,本文命名為lm.helloworld. proto 在網路通訊系統中,protobuf能夠提升通

一種自動反射訊息型別的 Google Protobuf 網路傳輸方案

陳碩 (giantchen_AT_gmail)這篇文章要解決的問題是:在接收到 protobuf 資料之後,如何自動建立具體的 Protobuf Message 物件,再做的反序列化。“自動”的意思是:當程式中新增一個 protobuf Message 型別時,這部分程式碼不

google protobuf 反射機制學習筆記

持續更新中。。。 何為反射機制 基本概念 指程式可以訪問、檢測和修改它本身狀態或行為的一種能力 程式集包含模組,而模組包含型別,型別又包含成員。反射則提供了封裝程式集、模組和型別的物件。您可以使用反射動態地建立型別的例項,將型別繫結到現有物件,或從

google protobuf 反射的例子

反射就是可以知道一個物件自身的資料屬性,例如有哪些欄位,欄位的值,函式等等。 下面的程式碼展示了protobuf 物件反射的例子。將一個物件按照反射的欄位順序序列化到string,然後反序列化到物件。最後呼叫反射列印其欄位值,可以看到物件能夠還原。 proto檔案為(暫時不

vs2013編譯google protobuf生成的訊息檔案錯誤。

用google protobuf 生成的.h 和.cpp放到工程目錄下,並新增好標頭檔案目錄和lib目錄,在main.cpp裡面新增 #pragma comment(lib,"libprotobuf.lib")//連結庫檔案 #pragma comment(lib,"lib

ImportError:No module named google.protobuf.internal

google logs protobuf clas font times pan cond family 當在anaconda中import caffe 時提示錯誤: 1 ImportError:No module named google.protobuf.intern

error: ‘kEmptyString’ is not a member of ‘google::protobuf::internal’

ring anaconda uil ble /usr nac space locate bin 最近安裝caffe,突然報這個錯: .build_release/src/caffe/proto/caffe.pb.h: In member function ‘void caf

Google Protobuf在Netty中的使用

連接 delay exce gin bootstrap 語言 sync socket cau [toc] Google Protobuf在Netty中的使用 程序代碼來自於《Netty權威指南》第8章,已經加了註釋,不過需要註意的是,使用的proto源代碼是在Google

caffe make error: class google::protobuf::RepeatedField<unsigned int> has no member named 'UnsafeMergeFrom'

sig name image member clas 5.0 http ogl ted 之前caffe中protobuf的版本是2.5.0,可在ternimal下執行:protoc --version 查看當前protobuf版本。 由於另外安裝了Tensorflow之後,

Google protobuf解析消息邏輯的版本問題

mage logs 有一個 https itl 2-2 -i clip 源代碼 在分析caffe2源碼的過程中,由於caffe2使用protobuf作為網絡結構和網絡參數序列化和反序列化的機制,想在反序列化之前進行加解密處理,這是反向protouf其實有兩個版本的實

Netty + ProtoBuf使用反射實現多種類型的傳輸方式

sta attribute short ext 低耦合 就是 是否 AD pat   本文是該文章的後續(https://www.cnblogs.com/Binhua-Liu/p/5577622.html),該文章介紹了在ProtoBuf上再加一層Header從來歸避Pro

Google Protobuf——實現跨平臺跨語言的序列化/反序列化

Google Protobuf——實現跨平臺跨語言的序列化/反序列化 0 Overview Google Protocol Buffer 是一個平臺無關、語言無關的結構化資料的序列化與反序列化工具。 1 Establish dev environment wget http:

由引入 Google Protobuf 引發的工程管理思考

看到標題,很多人可能會在想這個 Google Protobuf (後面簡稱 PB ) 是一個什麼東東,其實最開始我聽說的時候也在懷疑,甚至一開始我還以為是之前跟著大牛寫服務端功能時使用的 Thrift 混為一談,深入接觸後才發現,其實不然。至於 PB 到底是啥呢?我在這就不詳細介

[轉]google protobuf安裝與使用

google protobuf是一個靈活的、高效的用於序列化資料的協議。相比較XML和JSON格式,protobuf更小、更快、更便捷。google protobuf是跨語言的,並且自帶了一個編譯器(protoc),只需要用它進行編譯,可以編譯成Java、python、C++、C#、Go等程式碼,然

Protobuf 訊息定義

一、引言 本文用來介紹Google的protocol-buffer 訊息的格式以及使用事項,不會涉及相關api的使用 二、訊息定義 訊息由至少一個欄位組合而成,類似於C語言中的結構。每個欄位都有一定的格式 欄位格式:限定修飾符① | 資料型別② | 欄位名稱③ | = |

ubuntu16.04下編譯caffe出現.build_release/lib/libcaffe.so: undefined reference to google ::protobuf…的問題

人工智慧/機器學習/深度學習交流QQ群:811460433 程式設計師深度學習微信公眾號: ubuntu16.04下編譯caffe出現.build_release/lib/libcaffe.so: undefined reference to google ::protobuf…的

Netty學習之路(八)-Google Protobuf編碼

Protobuf是一個靈活,高效,結構化的資料序列化框架,相比於XML等傳統的序列化工具,它更小,更快,更簡單。Protobuf支援資料結構化一次可以到處使用,甚至可以跨語言使用,通過程式碼生成工具可以自動生成不同語言版本的原始碼,甚至可以在使用不同版本的資料結構程序間進行資料傳遞,實現資料

Protobuf 訊息定義

一、引言 本文用來介紹Google的protocol-buffer 訊息的格式以及使用事項,不會涉及相關api的使用 二、訊息定義 訊息由至少一個欄位組合而成,類似於C語言中的結構。每個欄位都有一定的格式 欄位格式:限定修飾符① | 資料型別②

基於google protobuf的gRPC實現(python版)

title: 基於google protobuf的gRPC實現(python版) date: 2018-08-14 12:01:12 tags: [protobuf,RPC,gRPC] categories: protobuf mathjax: False 1.Protobuf