簡體   English   中英

在C ++中更改現有protobuf消息的元素

[英]Changing an element of an existing protobuf message in C++

我只是想知道,為什么沒有人解決我最近遇到的與Google protobufs有關的問題,但是經過廣泛的搜索,閱讀了Google手冊頁的文檔並在Stackoverflow-DB中進行搜索之后,我沒有找到解決方案。

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

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

現在,我想修改一些消息,從文件中讀取消息,以便測試第二個應用程序的功能。 不幸的是,我的消息中包含很多嵌套消息,因此在反序列化之后,我必須調用類似

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

以便能夠處理實際數據。

我現在的問題是,如何在不創建另一個message類型的message情況下更改x的值,其中我還必須創建所有子消息( 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;

顯然,不可能直接在message對象或其子對象(例如message().a().b().c()....x().set_value();上調用set_value message().a().b().c()....x().set_value(); ,因為它會違反自動生成的protobuf消息的const要求,在該情況下,不允許在const對象上調用setter方法: 錯誤:將xxx作為xxx的“ this”參數傳遞會舍棄限定符

我希望能有任何創造性的解決方案來避免實現上面發布的遞歸new-set_allocated-delete代碼。

提前致謝

這樣做的關鍵是使用mutable_x()訪問器,因此在您的示例中,您將執行以下操作:

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

實際上,除非您真的知道自己在做什么,否則實際上不建議使用set_allocated_*方法,因為它們可以使您對通常不需要的內存管理有特殊的控制,除非您專門嘗試優化特定的代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM