Изменение элемента существующего сообщения protobuf в C++

Мне просто было интересно, почему никто не столкнулся с проблемой, с которой я недавно столкнулся в связи с google protobufs, но после обширного поиска в Google, чтения документации страницы руководства Google и поиска в Stackoverflow-DB я не нашел решения.

Я использую proto2-c++-API в Ubuntu 14.04.3 LTS, компилируя с помощью gcc/g++ поверх cmake-файлов.

У меня есть приложение, которое читает двоичные (сериализованные) буферные сообщения протокола Google из файла. Затем целью программы является отправка сообщений (без десериализации) другому приложению, которое продолжает обработку фактических данных.

Теперь я хотел бы изменить некоторые сообщения, прочитанные из файла, чтобы я мог проверить функциональность второго приложения. К сожалению, мое сообщение содержит много вложенных сообщений, поэтому после десериализации мне приходится вызывать что-то вроде

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

уметь работать с реальными данными.

Теперь мой вопрос: как я могу изменить значение x без создания другого сообщения типа message, где я также должен создать все подсообщения (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;

Очевидно, что невозможно вызвать set_value непосредственно для message-объектов, соответственно его подобъектов, таких как message().a().b().c()....x().set_value(); , так как это нарушило бы требования const автоматически сгенерированных protobuf-сообщений, где не разрешено вызывать setter-метод для константного объекта: ошибка: передача xxx как "это ' аргумент xxx отбрасывает квалификаторы

Я был бы признателен за любое творческое решение, позволяющее избежать реализации рекурсивного кода new-set_allocated-delete, опубликованного выше.

заранее спасибо


person Weana    schedule 15.02.2017    source источник


Ответы (1)


Ключом к этому является использование средств доступа mutable_x(), поэтому в вашем примере вы должны сделать что-то вроде этого:

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

Методы set_allocated_* на самом деле не рекомендуются, если вы действительно не знаете, что делаете, потому что они дают вам особый контроль над управлением памятью, который вам обычно не нужен, если только вы не пытаетесь специально оптимизировать конкретный фрагмент кода.

person Adam Cozzette    schedule 16.02.2017