Тип проводника буфера протокола 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, где тег появляется в конце значения - во всех остальных случаях тег появляется только в начале.

Напротив, обычные под-сообщения (как во втором примере выше) кодируются с использованием типа проводника с "разделением по длине": тег, за которым следует размер дополнительного сообщения, за которым следует содержимое. Обратите внимание, что кодировка с разделением по длине означает, что вы можете пропустить вложенное сообщение, не анализируя все его поля; для группы единственный способ узнать, где заканчивается группа, - это анализировать каждое поле, пока вы не увидите тег конечной группы.

Другие вопросы по тегам