gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 00:55:22 26 4
gpt4 key购买 nike

我只是想知道,为什么没有人解决我最近遇到的与 google protobufs 相关的问题,但是在大量谷歌搜索、阅读 google 手册页的文档并在 Stackoverflow-DB 中搜索之后,我没有找到解决方案。

我在 Ubuntu 14.04.3 LTS 上使用 proto2-c++-API,通过 cmake 文件使用 gcc/g++ 进行编译。

我有一个从文件中读取二进制(序列化)谷歌 Protocol Buffer 消息的应用程序。该程序的目的是将消息(不反序列化)发送到另一个应用程序,该应用程序继续处理实际数据。

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

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 要求,不允许调用 setter 方法在 const 对象上:error: passing xxx as 'this' argument of xxx discards qualifiers

我希望能有任何创造性的解决方案来避免实现上面发布的递归 new-set_allocated-delete 代码。

提前致谢

最佳答案

这样做的关键是使用 mutable_x() 访问器,因此在您的示例中您将执行如下操作:

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

set_allocated_* 方法实际上并不被推荐,除非你真的知道你在做什么,因为它们给了你对内存管理的特殊控制,你通常不需要,除非你特别尝试优化一段特定的代码。

关于c++ - 在 C++ 中更改现有 protobuf 消息的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42247283/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com