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

Wea*_*ana 3 c++ protocol-buffers protobuf-c

我只是想知道,为什么没有人解决我最近遇到的与 google protobufs 相关的问题,但是经过广泛的谷歌搜索、阅读谷歌手册页的文档并在 Stackoverflow-DB 中搜索后,我没有找到解决方案。

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

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

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

message().a().b().c()....x().value(); 
Run Code Online (Sandbox Code Playgroud)

能够处理实际数据。

我现在的问题是,如何在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;
Run Code Online (Sandbox Code Playgroud)

显然,不可能set_value直接在message-objects 上分别调用它的子对象,如message().a().b().c()....x().set_value();,因为这会违反自动生成的 protobuf-messages 的 const 要求,其中不允许在 const 上调用 setter-method对象: 错误:将 xxx 作为 xxx 的“this”参数传递会丢弃限定符

我将不胜感激任何创造性的解决方案,以避免实现new-set_allocated-delete上面发布的递归代码。

提前致谢

小智 7

关键是使用mutable_x()访问器,因此在您的示例中,您将执行以下操作:

message.mutable_a()->mutable_b()->mutable_c()->set_value(42);
Run Code Online (Sandbox Code Playgroud)

set_allocated_*除非您真的知道自己在做什么,否则实际上并不真正推荐这些方法,因为它们为您提供了对通常不需要的内存管理的特殊控制,除非您专门尝试优化特定的代码段。