2009-07-10 11 views
1

Ich hatte vor kurzem eine Diskussion mit einem Kollegen über die Serialisierung von Byte-Daten über ein Netzwerk. Er verwendete die Klasse BinaryFormatter, um die Byte-Daten zu parsen, die ich an ihn gesendet hatte. Dies hat nicht funktioniert und er hatte offensichtlich Ausnahme ... Ausnahmen. Binaryformatter konnte die Daten nicht richtig "parsen", da meine Daten einfach ein Byte-Array waren.Byte Serialisierung

Seine Motivation für BinaryFormatter war Plattformunabhängigkeit. Ich bin von einer solchen Haltung nicht überzeugt. Als wir beide BinaryReader oder BinaryWriter verwendeten, funktionierte das im Code Land gut.

Was ist die Verwendung von BinaryFormatter und sollte ich es in jedem Szenario verwenden, wo immer ich Bytes über die Leitung senden muss?

Antwort

2

Definitiv, wenn Sie Ihre Daten als byte[] haben, ist BinaryFormatter nicht eine kluge Sache zu verwenden. Sie schreiben einfach die Daten in die Leitung. Wenn Sie jedoch über eine Reihe von Objekten verfügen und diese in einen Stream serialisieren möchten, ist BinaryFormatter viel einfacher zu verwenden als jedes Feld manuell von Hand zu schreiben. Der Zweck von BinaryFormatter oder eines beliebigen Serializer/Deserializer-Schemas im Allgemeinen besteht darin, eine Möglichkeit bereitzustellen, einen Objektgraphen (möglicherweise komplex) als eine Sequenz von Bytes zu erhalten.

2

Es klingt für mich wie möchten Sie etwas wie "Protokoll Puffer", die (im Gegensatz zu BinaryFormatter) ist eine hohe Leistung, niedrige Bandbreite, portable/cross-platform, Version-tolerant binäre Serialisierung Format (wow, das ist a Schluck).

Glücklicherweise gibt es Versionen in .NET, z. B. protobuf-net.

(Offenlegung: Ich bin der Autor, aber es ist frei, ich bin nicht versuchen, etwas zu verkaufen - man muss nur viel Zeit und Schmerz speichern)

BinaryFormatter ist sehr ... spröde; Es ist .NET-spezifisch und hat eine relativ geringe Versionstoleranz. Die einzige Zeit, die ich es benutze, ist hinter den Kulissen für die Kommunikation zwischen AppDomain s auf dem gleichen Rechner. Sonst würde ich auf Contract-basierte Serialisierer wie XmlSerializer, DataContractSerializer oder Protobuf-net aussehen.