2011-12-22 2 views
11

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

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

То же самое относится к соответствующему методу десериализации.

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

ответ

9

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

Будучи включены, это также означает, что весь композитный поток сам полностью действительное сообщение Protobuf.

Пути использования этого:

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

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

+1

Почему включение тега делает его действительным сообщением protobuf? Нельзя ли десериализовать отдельные элементы в списке без тега? – Simone

+0

Кроме того, тип разрешения с использованием тега должен выполняться кодом приложения, правильно? – Simone

+1

@Simone делает сообщение * composite * действительным protobuf, потому что 'repeat MessageType' (in .proto) кодируется как последовательность« [tag] [length] [полезная нагрузка] ... [tag] [length] [ полезная нагрузка]». Следовательно, с тегом это действительный protobuf, и без: это не так. Re type resolution; обычно да, поскольку он намеренно независим от платформы; однако protobuf-net также включает некоторую * дополнительную * поддержку для включения некоторых данных ограниченного типа в провод. –

Смежные вопросы