4

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

我在 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_value直接调用message-objects,分别调用它的子对象message().a().b().c()....x().set_value();,如对象: 错误:将 xxx 作为 xxx 的“this”参数传递会丢弃限定符

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

提前致谢

4

1 回答 1

8

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

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

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

于 2017-02-16T17:04:51.487 回答