在C++中更改现有protobuf消息的元素
Changing an element of an existing protobuf message in C++
我只是想知道,为什么有人没有解决我最近遇到的与谷歌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_*
方法,因为它们为你提供了对内存管理的特殊控制,除非你专门试图优化特定的代码段,否则你通常不需要这种控制。
- 从 Any 包中提取和匹配 protobuf 消息类型名的首选方法
- protobuf,如何在protobuf消息中遍历所有集合字段,我不知道详细信息?(C++)
- 如何聚合protobuf消息
- C ++使用开关/大小写解析protobuf消息(减少重复代码)
- 编写多个 protobuf 消息:1 条具有 1 个重复属性的消息或编写不同的消息
- 动态生成Protobuf消息并将指针返回到它
- 在C++中更改现有protobuf消息的元素
- 将在64位应用程序中编码Protobuf消息并在32位应用程序中解码
- 解析来自固定大小字节缓冲区的连续块的protobuf消息序列
- C++中protobuf消息的长度前缀
- 是否可以在 protobuf 中发送编译的 protobuf 消息定义
- 遍历所有字段并在 protobuf 消息中获取它们的值
- 动态创建新的 protobuf 消息
- protobuf-net 中的动态 protobuf 消息
- 如何在解析文本格式的 protobuf 消息时忽略错误的字段
- 在Windows上从文件中读取多个分隔的protobuf消息
- 从部分google protobuf消息中检索信息
- 打印Protobuf消息时省略字段
- 通过winpcap API读取protobuf消息
- 在Java中编写带分隔符的c++ Protobuf消息和读取