Для фона «группы» - это другой способ представления под-сообщения. Они объявлены как это:
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 не должен использовать группы, поэтому я предполагаю, что протокол, с которым вы работаете, является одним из Google. (Если нет, возможно, у вас есть поврежденные данные.)
Предполагаю, вы уже прочитали the encoding docs, но они не объясняют группы.
Группы кодируются, начиная с тега «стартовая группа», за которым следует содержимое под-сообщения, за которым следует соответствующий тег «конечной группы». Это единственный случай в protobufs, где тег появляется в конце значения - во всех остальных случаях тег появляется только в начале.
Напротив, обычные под-сообщения (как во втором примере выше) кодируются с использованием типа провода с разделителями длины: тегом, за которым следует размер под-сообщения, а затем содержимое. Обратите внимание, как кодирование с разделителями по длине означает, что вы можете пропустить под-сообщение без разбора всех его полей; с группой, единственный способ узнать, где заканчивается группа, - анализировать каждое поле, пока не увидите тег конечной группы.
Спасибо за информацию, которая мне очень помогает. – user3232919