![](/img/trans.png)
[英]protobuf in C++ with dynamic binding for google::protobuf::Message
[英]Changing an element of an existing protobuf message in C++
我只是想知道,为什么没有人解决我最近遇到的与Google protobufs有关的问题,但是经过广泛的搜索,阅读了Google手册页的文档并在Stackoverflow-DB中进行搜索之后,我没有找到解决方案。
我在Ubuntu 14.04.3 LTS上使用proto2-c ++-API,并通过gmake / g ++在cmake文件上进行了编译。
我有一个从文件读取二进制(序列化)谷歌协议缓冲区消息的应用程序。 然后,程序的目的是将消息(不进行反序列化)发送到另一个应用程序,该应用程序继续处理实际数据。
现在,我想修改一些消息,从文件中读取消息,以便测试第二个应用程序的功能。 不幸的是,我的消息中包含很多嵌套消息,因此在反序列化之后,我必须调用类似
message().a().b().c()....x().value();
以便能够处理实际数据。
我现在的问题是,如何在不创建另一个message类型的message
情况下更改x
的值,其中我还必须创建所有子消息( 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;
显然,不可能直接在message
对象或其子对象(例如message().a().b().c()....x().set_value();
上调用set_value
message().a().b().c()....x().set_value();
,因为它会违反自动生成的protobuf消息的const要求,在该情况下,不允许在const对象上调用setter方法: 错误:将xxx作为xxx的“ this”参数传递会舍弃限定符
我希望能有任何创造性的解决方案来避免实现上面发布的递归new-set_allocated-delete
代码。
提前致谢
这样做的关键是使用mutable_x()
访问器,因此在您的示例中,您将执行以下操作:
message.mutable_a()->mutable_b()->mutable_c()->set_value(42);
实际上,除非您真的知道自己在做什么,否则实际上不建议使用set_allocated_*
方法,因为它们可以使您对通常不需要的内存管理有特殊的控制,除非您专门尝试优化特定的代码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.