Я также знаком со стратегиями борьбы с этим. с нуля:
- в основном разграничиваем его самостоятельно и вручную используем потоки ввода-вывода, чтобы сначала получить размер сообщения перед его анализом
- используя новый 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
}
Полагаю, если бы это было возможно, ограничением было бы то, что все подтипы Root должны быть типами сообщений, чтобы это можно было сделать. работаешь?
Подробнее здесь: https://stackoverflow.com/questions/788 ... -at-a-time