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

Changing an element of an existing protobuf message in C++

本文关键字:protobuf 消息 元素 C++      更新时间:2023-10-16

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

我在Ubuntu14.04.3 LTS上使用proto2-c++-API,在cmake-files上使用gcc/g++编译。

我有一个从文件中读取二进制(序列化)谷歌协议缓冲区消息的应用程序。然后,程序的目的是将消息(无需反序列化)发送到另一个应用程序,该应用程序继续处理实际数据。

我现在想修改一些从文件中读取的消息,以便测试第二个应用程序的功能。不幸的是,我的消息包含了很多嵌套的消息,所以在反序列化之后,我必须调用类似的东西

message().a().b().c()....x().value(); 

以便能够使用实际数据。

我现在的问题是,我如何在不创建另一个类型为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-对象上调用set_value,分别调用其子对象(如message().a().b().c()....x().set_value();),因为这将违反自动生成的protobuf消息的const要求,其中不允许在const对象上调用setter方法:error:将xxx作为';这';xxx的自变量丢弃限定符

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

提前感谢

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

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

除非你真的知道自己在做什么,否则实际上并不推荐使用set_allocated_*方法,因为它们为你提供了对内存管理的特殊控制,除非你专门试图优化特定的代码段,否则你通常不需要这种控制。