2009-07-10 4 views
1

Недавно я поговорил с коллегой о сериализации байтовых данных по сети. Он использовал класс BinaryFormatter, чтобы «разобрать» данные байта, которые я отправлял ему. Это не сработало, и у него, очевидно, было исключительных ... исключений. Binaryformatter не смог «правильно разобрать» данные, так как мои данные были просто массивом байтов.Байт-сериализация

Его мотивация для BinaryFormatter была независимость от платформы. Я не убежден в такой позиции. Когда мы оба использовали BinaryReader или BinaryWriter, все хорошо работало на земле кода.

В чем смысл использования BinaryFormatter, и следует ли использовать его в каждом сценарии, где мне нужно отправлять байты по проводу?

ответ

2

Определенно, если у вас есть данные как byte[], BinaryFormatter - это не разумная вещь. Вы просто записываете данные на провод. Однако, если у вас есть набор объектов и вы хотите их сериализовать в поток, BinaryFormatter гораздо проще в использовании, чем вручную вручную записывать каждое поле каждого типа. Цель BinaryFormatter или любой схемы сериализации/десериализатора в целом заключается в том, чтобы обеспечить способ сохранения графа объекта (возможно, сложного) в виде последовательности байтов.

2

Это звучит так, как будто вы можете посмотреть что-то вроде «протокольных буферов», которое (в отличие от BinaryFormatter) представляет собой высокопроизводительный, с низкой пропускной способностью, portable/cross-platform, совместимый с версиями двоичный формат сериализации (wow, полный рот).

К счастью, в .NET есть версии, такие как protobuf-net.

(раскрытие: я автор, но он свободен, я не пытаюсь продать вам что-нибудь - просто сэкономить много времени и боли)

BinaryFormatter очень ... ломкий; он специфичен для .NET и имеет относительно низкую допустимость версии. Единственный раз, когда я использую его, - это за кулисами для связи между AppDomain s на том же компьютере. В противном случае я бы посмотрел на сериализаторы на основе контрактов, такие как XmlSerializer, DataContractSerializer или protobuf-net.