Байтовая сериализация
-
12-09-2019 - |
Вопрос
Недавно у меня была дискуссия с коллегой о сериализации байтовых данных по сети. Он использовал BinaryFormatter
Класс, чтобы «раскрыть» данные байтов, которые я отправлял ему. Это не сработало, и он явно исключительный... исключения. Binaryformatter
Не удалось «разобраться» с данными правильно, так как мои данные были просто массивом байтов.
Его мотивация для BinaryFormatter
была независимость платформы. Я не убежден в такой позиции. Когда мы оба использовали BinaryReader
или же BinaryWriter
, все хорошо сработало на кодовой земле.
Что такое использование BinaryFormatter
И должен ли я смотреть на его использование в каждом сценарии, где бы мне нужно отправлять байты через проволоку?
Решение
Определенно, если у вас есть данные как byte[]
, BinaryFormatter
не мудр для использования. Вы просто записываете данные в проволоку. Однако, если у вас есть набор объектов и вы хотите сериализовать их на поток, BinaryFormatter
гораздо проще в использовании, чем вручную писать каждое поле каждого типа вручную. Цель BinaryFormatter
Или любая схема сериализатора/десериализатора в целом заключается в том, чтобы обеспечить способ сохранить график объекта (возможно, сложный) в качестве последовательности байтов.
Другие советы
Мне кажется, что вы, возможно, захотите взглянуть на что -то вроде «буферов протокола», которое (в отличие от BinaryFormatter
) является высокопроизводительной, низкой пропускной способностью, Портативный/кроссплатформенный, версия-толерантный бинарный формат сериализации (вау, это глоток).
К счастью, в .NET есть версии, такие как Protobuf-Net.
(Раскрытие: я автор, но оно бесплатно; я ничего не пытаюсь вам продать - просто сэкономить вам много времени и боли)
BinaryFormatter
очень ... хрупкий; Это специфично .NET и имеет относительно плохую версию терпимости. Единственный раз, когда я использую его, находится за кулисами для общения между AppDomain
S на той же машине. В противном случае я бы посмотрел на сериалы на основе контрактов, такие как XmlSerializer
, DataContractSerializer
, или Protobuf-Net.