Protobuf анализирует поля сообщений по одномуC++

Программы на C++. Форум разработчиков
Anonymous
Protobuf анализирует поля сообщений по одному

Сообщение Anonymous »

Я знаком с форматом передачи protobuf, разработчики которого решили не указывать размер сериализованного сообщения в сети.
Я также знаком со стратегиями борьбы с этим. с нуля:
  • в основном разграничиваем его самостоятельно и вручную используем потоки ввода-вывода, чтобы сначала получить размер сообщения перед его анализом
  • используя новый google/protobuf/util/delimited_message_util.h, который справится с этим за вас.
Однако у меня немного другой взгляд (и вопрос).
Учитывая уже сериализованное сообщение, которое я не контролирую, я хочу загрузить каждое из его полей по одному. Обратите внимание: хотя размер сериализованного сообщения не кодируется (см. предыдущие пункты), размер каждого из его полей кодируется. Кроме того, идентификатор поля также кодируется. См. здесь.
Поэтому теоретически должно быть возможно иметь что-то вроде функции ParseMsgField ниже. Если задан корневой объект, который был ранее сериализован (и, следовательно, его поля DID были закодированы), загружайте каждое из его полей по одному.

Код: Выделить всё

package my_proto;

message SubType0 {
uint32 Val = 1;
}

message SubType1 {
uint32 Val = 1;
}

message Root {
repeated SubType0 subtype = 1;
repeated SubType1 subtype = 2;
}

Код: Выделить всё

#include "my_proto.pb.h"

// how to implement this...?
int ParseMsgField(
google::protobuf::Descriptor* root_descriptor,
google::protobuf::Message* field_msg,
google::protobuf::io::FileInputStream& fin
);

int main() {

int fd = open("my_file", O_RDONLY);
google::protobuf::io::FileInputStream fin(fd);

auto* root_descriptor = my_proto::Root::descriptor();

google::protobuf::Message* field_msg;
while(true) {
int field_id = ParseMsgField(root_descriptor, field_msg, fin);
if (field_id == -1) {
break;
}

// handle each field type, either dynamic_cast or test field_id + static_cast
}
Мне интересно, как реализовать функцию ParseMsgField? Входные параметры, которые я использовал, являются догадками о том, что мне может понадобиться...
Полагаю, если бы это было возможно, ограничением было бы то, что все подтипы Root должны быть типами сообщений, чтобы это можно было сделать. работаешь?

Подробнее здесь: https://stackoverflow.com/questions/788 ... -at-a-time

Вернуться в «C++»