Мне просто было интересно, почему никто не столкнулся с проблемой, с которой я недавно столкнулся в связи с 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
, опубликованного выше.
заранее спасибо