Packed versus unpacked repeated fields
One last important concept that is important to know is the concept of packed and unpacked repeated fields. As we know, repeated is the way we describe lists in Protobuf. A repeated modifier can be applied to a scalar type (int32, uint64, and so on) but can also be applied to more complex types (user-defined types, strings, and so on). The former will be encoded as a packed repeated field, and the latter will be unpacked.
Before going into more detail, let’s visualize the difference between both encodings. Let’s start with a packed repeated field. We will have a list of integers (repeated/encoding.proto
):
syntax = "proto3"; message Encoding { repeated uint64 us = 1; }
We can now set some values for it by describing the data in text format (repeated/packed.txtpb
):
us: [1, 2, 3, 4, 5]
Now, let’s run the following command:
$ cat packed.txtpb | protoc --encode=Encoding encoding.proto | hexdump...