C++ 更改C+中现有protobuf消息的元素+;

C++ 更改C+中现有protobuf消息的元素+;,c++,protocol-buffers,protobuf-c,C++,Protocol Buffers,Protobuf C,我只是想知道,为什么有人没有经历过我最近遇到的与谷歌protobufs有关的问题,但是经过大量的谷歌搜索,阅读谷歌手册页面的文档并在Stackoverflow数据库中搜索,我没有找到解决方案 我在Ubuntu 14.04.3 LTS上使用proto2-c++-API,在cmake文件上使用gcc/g++进行编译 我有一个从文件中读取二进制(序列化)google协议缓冲区消息的应用程序。然后,程序的目的是将消息(无需反序列化)发送到另一个应用程序,该应用程序继续处理实际数据 现在我想修改一些从文件

我只是想知道,为什么有人没有经历过我最近遇到的与谷歌protobufs有关的问题,但是经过大量的谷歌搜索,阅读谷歌手册页面的文档并在Stackoverflow数据库中搜索,我没有找到解决方案

我在Ubuntu 14.04.3 LTS上使用proto2-c++-API,在cmake文件上使用gcc/g++进行编译

我有一个从文件中读取二进制(序列化)google协议缓冲区消息的应用程序。然后,程序的目的是将消息(无需反序列化)发送到另一个应用程序,该应用程序继续处理实际数据

现在我想修改一些从文件中读取的消息,以便测试第二个应用程序的功能。不幸的是,我的消息包含很多嵌套消息,所以在反序列化之后,我必须调用

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_值
,分别调用其子对象,如
message().a().b().c()…x().set_值(),因为这样会违反自动生成的protobuf消息的const要求,其中不允许对const对象调用setter方法:

我希望任何创造性的解决方案都能避免实现上面发布的递归
new-set\u-delete
code


提前感谢

关键是使用
mutable_x()
访问器,因此在您的示例中,您可以这样做:

message.mutable_a()->mutable_b()->mutable_c()->set_value(42);
除非您真的知道自己在做什么,否则实际上并不推荐使用
set\u allocated.*
方法,因为它们为您提供了对内存管理的特殊控制,而您通常不需要这些控制,除非您特别尝试优化特定的代码