Эти служебные данные - это просто информация, которая должна знать, где начинается и заканчивается каждый из 20 объектов.Здесь нет ничего, что я могу сделать по-другому, не нарушая формат (то есть делая что-то, противоречащее спецификации).
Если вы действительно хотите узнать подробности:
Массив или список (если мыисключить «упакованный», что здесь не применимо) просто повторяющийся блок вложенных сообщений.Для вложенных сообщений доступны две раскладки;строки и группы.Со строкой макет выглядит следующим образом:
[header][length][data]
, где header
- закодированное с помощью варинтов сусло типа провода и номера поля (в данном случае это шестнадцатеричное 08 с полем 1), length
это размер в кодировке varint data
, а data это сам подобъект.Для небольших объектов (data
менее 128 байт) это часто означает 2-байтовые издержки на объект в зависимости от: номера поля (поля выше 15 занимают больше места) и b: размера данных.
Для группы макет имеет вид:
[header][data][footer]
, где header
- это закодированное с помощью varint сусло типа провода и номера поля (в данном случае это шестнадцатеричный 0B с полем 1), data
- это подобъект, а footer
- это еще одна переменная, которая указывает на конец объекта (в данном случае это шестнадцатеричный код 0C с полем 1).
Обычно группы менее предпочтительны, но имеютпреимущество в том, что они не несут накладных расходов, так как data
увеличивается в размере.Для небольших номеров полей (менее 16) опять-таки служебные данные составляют 2 байта на объект.Конечно, вы платите вдвое больше за большие номера полей.