Ответ 1
В принципе, это дополнительный маркер, который может (хотя и не обязательно) использоваться для обозначения "типа" добавляемого сообщения, поскольку презумпция (при использовании подхода *WithLengthPrefix
) заключается в том, что существуют несколько сообщений в одном потоке.
При включении это также означает, что весь составной поток сам является полностью действительным сообщением protobuf.
Способы использования:
- вы можете сериализовать
List<Foo>
, а затем повторно десериализовать (с длиной-префикс) отдельные элементыFoo
или наоборот - с гетерогенным набором объектов вы можете использовать API
Serializer.NonGeneric
, чтобы разрешить разрешение по типу на основе тега, то есть эквивалент кода "if 1 then Invoice", если 2 then Order, если 3, то пропустите его, если 4, то Клиент "и т.д. - это особенно полезно при использованииNetworkStream
в качестве устройства отправки сообщений. Этот подход (с использованием другого тега для каждого типа) позволяет вам считывать объекты из потока и десериализовать их правильно, не зная заранее тип следующего сообщения.
Можно опустить это, если хотите - просто пройти ноль (IIRC). Это сэкономит (как правило) байт на каждое добавленное сообщение, но: это означает, что поток больше не является действительным protobuf. Его все равно можно прочитать, конечно, путем пропускания нуля при чтении.