在 C++ 中更改现有 protobuf 消息的元素
Changing an element of an existing protobuf message in C++
我只是想知道,为什么没有人解决我最近遇到的与 google protobufs 有关的问题,但经过大量谷歌搜索后,阅读了 google 手册页的文档并在 Whosebug-DB 中搜索,我没有找到解决方案。
我在 Ubuntu 14.04.3 LTS 上使用 proto2-c++-API,通过 cmake 文件使用 gcc/g++ 进行编译。
我有一个应用程序可以从文件中读取二进制(序列化)google 协议缓冲区消息。该程序的目的是将消息(不反序列化)发送到另一个应用程序,该应用程序继续处理实际数据。
我现在想修改一些消息,从文件中读取,这样我就可以测试第二个应用程序的功能。不幸的是,我的消息包含很多嵌套消息,所以反序列化后我必须调用
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();
,因为这样会违反 auto 的 const 要求-生成的 protobuf 消息,不允许在 const 对象上调用 setter 方法: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_*
方法,除非您真的知道自己在做什么,因为它们可以让您对内存管理进行特殊控制,除非您专门尝试优化,否则通常不需要一段特定的代码。
我只是想知道,为什么没有人解决我最近遇到的与 google protobufs 有关的问题,但经过大量谷歌搜索后,阅读了 google 手册页的文档并在 Whosebug-DB 中搜索,我没有找到解决方案。
我在 Ubuntu 14.04.3 LTS 上使用 proto2-c++-API,通过 cmake 文件使用 gcc/g++ 进行编译。
我有一个应用程序可以从文件中读取二进制(序列化)google 协议缓冲区消息。该程序的目的是将消息(不反序列化)发送到另一个应用程序,该应用程序继续处理实际数据。
我现在想修改一些消息,从文件中读取,这样我就可以测试第二个应用程序的功能。不幸的是,我的消息包含很多嵌套消息,所以反序列化后我必须调用
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();
,因为这样会违反 auto 的 const 要求-生成的 protobuf 消息,不允许在 const 对象上调用 setter 方法: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_*
方法,除非您真的知道自己在做什么,因为它们可以让您对内存管理进行特殊控制,除非您专门尝试优化,否则通常不需要一段特定的代码。