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