Тип проводника буфера протокола Google: использование начальной группы и конечной группы
Попытка разобрать сообщение с сервера, который передает тип проводника как Start Group . Я использую protobuf-c lib, в котором начальная группа и конечная группа не поддерживаются (последние). Есть ли примеры, как работать с проводным типом в качестве начальной группы, чтобы я мог самостоятельно проанализировать сообщение
заранее спасибо
1 ответ
Для фона "группы" - это другой способ представления вложенного сообщения. Они объявлены так:
message Foo {
repeated group bar = 1 {
optional int32 baz = 2;
optional string qux = 3;
}
}
Семантически это почти точно так же, как:
message Foo {
repeated Bar bar = 1;
message Bar {
optional int32 baz = 2;
optional string qux = 3;
}
}
Однако кодировка немного отличается (объяснено ниже).
Группы уже устарели в то время, когда Protobuf был впервые открыт с открытым исходным кодом, поэтому многие реализации сторонних разработчиков не поддерживают группы. У Google есть несколько очень старых протоколов, которые все еще используют группы, но, вероятно, никто за пределами Google не должен использовать группы, поэтому я предполагаю, что протокол, с которым вы работаете, является одним из Google. (Если нет, возможно, у вас просто поврежденные данные.)
Я предполагаю, что вы уже прочитали документы по кодированию, но они не объясняют группы.
Группы кодируются, начиная с тега "начальная группа", за которым следует содержание дополнительного сообщения, за которым следует соответствующий тег "конечная группа". Это единственный случай в protobufs, где тег появляется в конце значения - во всех остальных случаях тег появляется только в начале.
Напротив, обычные под-сообщения (как во втором примере выше) кодируются с использованием типа проводника с "разделением по длине": тег, за которым следует размер дополнительного сообщения, за которым следует содержимое. Обратите внимание, что кодировка с разделением по длине означает, что вы можете пропустить вложенное сообщение, не анализируя все его поля; для группы единственный способ узнать, где заканчивается группа, - это анализировать каждое поле, пока вы не увидите тег конечной группы.