protobuf的使用誤區(cpp)

2021-07-04 21:57:50 字數 1067 閱讀 1305

根據我使用中發現的問題,protobuf的使用需要慎重使用parsefromstring來實現反序列化的。

有興趣深究protobuf反序列化原理的兄台可以瞅瞅序列化之後的內容,好像是如下格式

乙個位元組的轉譯字元 | member name| member value

如果有乙個memory buffer,現在需要反序列化為乙個類,萬不可使用parsefromstring,隱藏著潛在的bug。如果buffer中有非字元內容,肯定反序列化的結果是有問題的。截斷的情況是隱藏的,視buffer內容而定,最關鍵的一點,發生截斷的時候也沒有異常。其場景如下**(錯誤用法)

char * buf ;

...獲取記憶體快內容

string str = buf ;

proto.parsefromstring(str)

此時需要做如下的操作:

用memory buffer例項化stringstream物件,

呼叫stringstream的pubsetbuf(basebuf, length)函式將記憶體塊填充進去,注意,此處不可以將buffer賦值給乙個string物件,然後用string物件構造乙個stringstream。這時候會發生截斷。

看到github上面的很多人的使用都是錯誤的。本來想找乙個epoll+protobuf的基礎工程的**的,看來這個工作還得自己去做。

其問題可以簡化用以下**描述。(錯誤用法)

char * buf ;

...string str = buf ;

stringstream s(str) ;

proto.parsefromistream(s);

如下**段的用法為正確用法

stringstream s;

s.rdbuf()->pubsetbuf(buf, length);

proto.parsefromistream(&s) ;

注意上面的length不能用strlen(buf)來獲取。

protobuf的使用 三

rpc方法的序列化和反序列化 rpc標籤 在protobuf中定義描述rpc方法的型別 service 在proto檔案中增加rpc服務的選項 表示生成service服務類和rpc方法描述,預設是不生成的 option cc generic services true message loginre...

protobuf的簡單使用

作業系統 centos7.3.1611 x64 gcc版本 4.8.5 go 版本 go1.8.3 linux amd64 python 版本 2.7.5 libprotoc 2.5.0 protobuf是google開發一種資料描述語言,能夠將結構化資料序列化,可用於資料儲存 通訊協議等方面。首頁...

protobuf簡單使用

一 介紹 首先,protobuf是乙個開源專案,而且是後台很硬的開源專案。網上現有的大部分 至少80 開源專案,要麼是某人單幹 要麼是幾個閒雜人等合夥搞。而protobuf則不然,它是 鼎鼎大名的google公司開發出來,並且在google內部久經考驗的乙個東東。由此可見,它的作者絕非一般閒雜人等可...