2010-02-22 3 views

ответ

1

Я не играл с C++ API, поэтому вам придется дать мне немного больше контекста/информации. Что делает этот метод? Возможно, образец использования?

Если вы уничтожаете данные из потока, есть «WithLengthPrefix» версию для автоматизации ограничения на сдержанные сообщения, или я верю метод просто прочитать следующую длиной из потока на общественном API.

Если вы хотите получить длину на месте сериализации, то в настоящее время я подозреваю, что самым простым вариантом может быть сериализация в фиктивный поток и отслеживание длины. Как ни странно, ранняя версия protobuf-net имела методы «получить длину, не выполняя работу», но после обсуждения protobuf-net я удалил их. Очевидно, что сериализованные данные по-прежнему отслеживаются. Однако, поскольку API отличается от длины двоичных данных для объектов, он недоступен «бесплатно».

Если вы уточните, что такое прецедент, я уверен, что мы сможем сделать его доступным (если его еще нет).


Отзыв о комментарии; это то, что я подозревал. Поскольку protobuf-net переводит двоичный перевод в последний момент (поскольку он имеет дело с обычными типами .NET, а не с самогенерируемым кодом), нет автоматического способа получить это значение без выполнения работы. Я мог бы добавить механизм, позволяющий вам получить это значение, написав Stream.Null? но если вам нужны данные в любом случае, вам может понадобиться только письмо до MemoryStream и проверка .Length перед копированием данных.

+0

Метод Message :: ByteSize() возвращает сериализованный размер сообщения и все его данные, включая под-сообщения. Я искал аналогичную функцию для назначения буферов перед вызовом SerializeWithLengthPrefix(), но в качестве альтернативы может позволить MemoryStream обрабатывать расширяющийся буфер и использовать вызов ToArray() для получения буфера для сетевого кода. –

+0

@ Sébastien Taylor - я обновлю ... –