Для чего нужен аргумент тега protobuf-net SerializeWithLengthPrefix? - PullRequest
12 голосов
/ 22 декабря 2011

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

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

1 Ответ

10 голосов
/ 22 декабря 2011

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

Включение также означает, что весь составной поток является полностью действительным сообщением protobuf. * ​​1010 *

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

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

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

...