繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM