Для фона «группы» — это другой способ представления подсообщения. Они объявляются так:
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. (Если нет, возможно, вы просто испортили данные.)
Я предполагаю, что вы уже читали документы по кодированию, но они не t объяснить группы.
Группы кодируются, начиная с тега «начальная группа», за которым следует содержимое подсообщения, за которым следует соответствующий тег «конечная группа». Это единственный случай в protobufs, когда тег появляется в конце значения — во всех остальных случаях тег появляется только в начале.
Напротив, обычные подсообщения (как во втором примере выше) кодируются с использованием типа проводника «с разграничением по длине»: тег, за которым следует размер подсообщения, за которым следует содержимое. Обратите внимание, что кодирование с разделителями по длине означает, что вы можете пропустить вложенное сообщение, не анализируя все его поля; с группой единственный способ узнать, где заканчивается группа, — это анализировать каждое поле, пока вы не увидите тег end-group.
20.11.2015