Что такое аргумент тега protobuf-net SerializeWithLengthPrefix для?

Этот метод принимает в качестве последнего аргумента целое число, но я не уверен, что понимаю, что я буду использовать его точно.

Serializer.SerializeWithLengthPrefix(stream, object, PrefixStyle.Base128, [tag]);

То же самое относится к соответствующему методу Deserialize.

Это просто способ помечать сообщения для добавления каких-либо "запросов" в десериализацию, чтобы отфильтровывать нежелательные сообщения или иметь какие-либо другие способы использования?

Ответ 1

В принципе, это дополнительный маркер, который может (хотя и не обязательно) использоваться для обозначения "типа" добавляемого сообщения, поскольку презумпция (при использовании подхода *WithLengthPrefix) заключается в том, что существуют несколько сообщений в одном потоке.

При включении это также означает, что весь составной поток сам является полностью действительным сообщением protobuf.

Способы использования:

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

Можно опустить это, если хотите - просто пройти ноль (IIRC). Это сэкономит (как правило) байт на каждое добавленное сообщение, но: это означает, что поток больше не является действительным protobuf. Его все равно можно прочитать, конечно, путем пропускания нуля при чтении.