Мне просто интересно, почему никто не сталкивался с проблемой, которую я недавно имел в связи с google protobufs, но после обширного поиска в Google, чтения документации на странице руководства Google и поиска в Stackoverflow-DB я не нашел решения.Изменение элемента существующего сообщения protobuf в C++
Я использую 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();
, как можно было бы нарушить константные требования автоматически сгенерированных Protobuf-сообщений о, где не разрешено вызывать метод setter на const-объекте: error: passing xxx as 'this' argument of xxx discards qualifiers
Я был бы признателен любым креативным решениям, чтобы избежать реализации рекурсивного кода new-set_allocated-delete
, опубликованного выше.
Заранее спасибо
Если вы хотите просто присвоить новое значение некоторому подчиненному 'c', вы можете просто выполнить регулярное присвоение с = следующим образом:' * b.mutable_c() = other_c; ' –
И вы правы в отношении стандартные геттеры против изменчивых; это просто разница чтения/записи. –
Вот и все. Спасибо за ваши усилия. – Weana