在C ++

时间:2017-02-15 10:53:12

标签: c++ protocol-buffers protobuf-c

我只是想知道,为什么有人没有解决我最近与谷歌protobufs有关的问题,但经过大量的谷歌搜索,阅读谷歌的手册页的文档和在Stackoverflow-DB中搜索,我没有找到一个解。

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

我有一个应用程序从文件中读取二进制(序列化)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_value - 对象上调用message,分别调用message().a().b().c()....x().set_value();等子对象,因为会违反自动生成的const要求protobuf-messages,不允许在const对象上调用setter-method:error: passing xxx as 'this' argument of xxx discards qualifiers

我很感激任何有创意的解决方案,以避免实施上面发布的递归new-set_allocated-delete代码。

提前致谢

1 个答案:

答案 0 :(得分:4)

关键是使用mutable_x()访问器,所以在你的例子中你会做这样的事情:

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

set_allocated_*方法实际上并不是真正推荐的,除非你真的知道自己在做什么,因为它们可以让你特别控制你通常不需要的内存管理,除非你专门试图优化特定的一段代码。