2017-02-15 29 views
1

我只是想知道,爲什麼有人沒有經歷我最近與google protobufs有關的問題,但是經過大量的搜索後,閱讀了google手冊頁的文檔並搜索在Stackoverflow-DB中,我沒有找到解決方案。更改C++中現有protobuf消息的元素

我在Ubuntu 14.04.3 LTS上使用proto2-C++ - API,通過cmake文件使用gcc/g ++進行編譯。

我有一個應用程序從文件讀取二進制(序列化)谷歌協議緩衝區消息。然後程序的目的是將消息(沒有反序列化)發送到另一個應用程序,該程序繼續處理實際數據。

我現在想修改一些消息,從文件中讀取,這樣我就可以測試第二個應用程序的功能了。不幸的是我的消息中包含了大量的嵌套的消息,所以反序列化後,我要叫像

message().a().b().c()....x().value(); 

能夠與實際數據的工作。

我現在的問題是:如何可以改變的x值,而無需創建message類型的另一個消息,我還必須創建所有子消息(a,b,c...),並與相應的前身在下面的僞分配這些樣碼?!

a = new a(); 
b = new b(); 
c = new c(); 
... 
v = new v(); 
w = new w(); 
x = new x(); 
x.set_value(); 
w.set_allocated_x_value(x); 
v.set_allocated_w_value(w); 
... 
a.set_allocated_b_value(b); 
message.set_allocated_a_value(a); 

... 
/* forward message to second application */ 
... 


delete x; 
delete w; 
... 
delete a; 

顯然,這是不可能直接調用set_valuemessage -objects,分別像message().a().b().c()....x().set_value();它的子對象,作爲一個將違反自動生成的protobuf的消息的常量的要求,它是不允許在const對象上調用setter方法:error: passing xxx as 'this' argument of xxx discards qualifiers

我將不勝感激任何有創意的解決方案,以避免實現上面發佈的遞歸new-set_allocated-delete代碼。

在此先感謝

回答

3

這裏的關鍵是使用mutable_x()存取,所以在你的榜樣,你會做這樣的事情:

message.mutable_a()->mutable_b()->mutable_c()->set_value(42); 

set_allocated_*方法實際上並不推薦使用,除非你真的知道你在做什麼,因爲他們給你特殊的內存管理控制,通常你不需要這些管理,除非你專門試圖優化某個特定的代碼。

0

感謝您的迴應,Adam Cozzette。使用mutable_x訪問者是我的問題的解決方案。

不過我對產生的protobuf C++所提供的類方法的一些其他問題 - 代碼:

當不建議使用set_allocated_x方法 - 我該如何實際設置嵌套消息的價值?在上面的例子中,我會例如喜歡改變mutable_c,這是一個protobuf消息本身。我看不到任何其他方法,而不是在這種情況下使用`set_allocated'ones?!

我的第二個問題是,何時使用標準的getter-methods和何時使用mutable_x()?這只是一個讀/寫差異,這意味着我會使用第一個獲取當前值,第二個更改它們?

+0

如果你只想給一些子消息'c'分配一個新的值,那麼你可以用=來做一個常規的賦值:'* b.mutable_c()= other_c;' –

+0

你說得對標準吸氣劑與可變吸收劑;這只是一個讀/寫的區別。 –

+0

就是這樣。謝謝你的努力。 – Weana