Frage

Ich verbrachte einen guten Teil der Zeit auf die Serialisierung der vergangenen Woche zu arbeiten. Während dieser Zeit fand ich viele Beispiele entweder die BinaryFormatter oder XmlSerializer verwendet. Leider was ich nicht finden wurden umfassend alle Beispiele, die die Unterschiede zwischen den beiden Detaillierung.

Die Entstehung meiner Neugier liegt in warum die BinaryFormatter der Lage ist, direkt an eine Schnittstelle deserialisieren während der XmlSerializer nicht. Jon Skeet in einer Antwort auf ", um mehr (unbekannte Typen) zur Laufzeit Gießen " an eine Schnittstelle ein Beispiel einer direkten binärer Serialisierung ermöglicht. Stan R. mich mit den Mitteln mein Ziel zu erreichen, die XmlSerializer in seiner Antwort auf „XML Deserialisierung Object to Interface ."

Neben dem offensichtlichen des BinaryFormatter verwendet binäre Serialisierung während der XmlSerializer verwendet XML Ich möchte mehr in vollem Umfang die grundlegenden Unterschiede zu verstehen. Wenn das eine oder das andere und die Vor- und Nachteile der einzelnen verwenden.

War es hilfreich?

Lösung

Der Grund ein binäres Formatierers der Lage ist, direkt mit einem Schnittstellentyp deserialisieren ist, weil wenn ein Objekt ursprünglich serialisiert einen Binärstrom Metadatentyp und Montageinformationen enthält, in den Objektdaten geklebt wird. Dies bedeutet, dass, wenn das binäre Formatierungsprogramm deserialisiert das Objekt, um es seine Art kennt, das richtige Objekt baut und Sie können dann, dass an einen Schnittstelle Typen umgewandelt, die Geräte-Objekt.

Der XML-Serializer auf dem Otherhand serialisiert nur ein Schema und serialisiert nur die öffentlichen Felder und Werte des Objekts und keine Typinformationen andere dann, dass (beispielsweise Schnittstellen die Art implementiert).

Hier ist ein guter Beitrag, .NET Serialisierung , vergleicht die BinaryFormatter , SoapFormatter und XmlSerializer . Ich empfehle Ihnen auf der folgenden Tabelle sehen, die auf die zuvor zusätzlich erwähnt Serializer die DataContractSerializer , NetDataContractSerializer und protobuf-net .

Serialisierung Vergleich

Andere Tipps

Nur wiegen ...

Der offensichtliche Unterschied zwischen den beiden ist „binary vs xml“, aber es hat viel tiefer als das gehen:

  • Felder (BinaryFormatter = bf) vs Öffentlichkeit Mitglieder (in der Regel Eigenschaften) (XmlSerializer = xs)
  • Typ-Metadaten basieren (bf) vs vertragsbasierte (xs)
  • versions spröde (bf) vs Version tolerante (xs)
  • "Graph" (bf) vs "Baum" (xs)
  • .NET spezifische (bf) vs portable (xs)
  • opak (bf) vs Menschen lesbaren (xs)

Als Diskussion darüber, warum BinaryFormatter spröde sein kann, sehen hier .

Es ist unmöglich, zu diskutieren, welche größer ist; alle Art von Metadaten in BinaryFormatter kann es größer machen. Und XmlSerializer kann wie gzip sehr mit Kompression arbeiten.

Allerdings ist es möglich, die jeweiligen Stärken zu nehmen; haben zum Beispiel Google, ihre eigenen Daten Serialisierungsformat-Open Source „Protokollpuffer“. Dies ist:

  • vertragsbasierte
  • portable (siehe Liste von Implementierungen )
  • Version tolerante
  • Baum-basierte
  • opak (obwohl es gibt Werkzeuge, Daten zu zeigen, wenn sie mit einem .proto kombiniert)
  • Regel „ Vertrag zunächst “, aber einige Implementierungen ermöglichen implizite Verträge basierend auf Reflexion

Aber wichtiger ist, es ist sehr dicht Daten (keine Art von Metadaten, rein binäre Darstellung, kurze Tags, Tricks wie varianten Länge Basis-7-Codierung), und sehr effizient zu verarbeiten (keine komplexe XML-Struktur, keine Strings entsprechen zu Mitglieder, etc).

Ich könnte ein wenig voreingenommen sein; Ich behaupte, eine der Implementierungen (einschließlich mehrerer geeignet für C # /. NET), aber Sie werden bemerken, ich habe nicht   jeder spezifische Implementierung verbunden sind; das Format steht unter seinen eigenen Verdiensten ;-p

Der XML-Serializer erzeugt XML und auch ein XML-Schema (implizit). Es wird XML erzeugen, die zu diesem Schema entspricht.

Eine Folge ist, dass es nichts serialisiert werden, die in XML-Schema nicht beschrieben werden können. Zum Beispiel gibt es keine Möglichkeit, zwischen einer Liste und einem Array in XML-Schema, so dass das XML-Schema erzeugt durch den Serializer zu unterscheiden kann so oder so interpretiert werden.

Runtime-Serialisierung (die BinaryFormatter gehört) serialisiert die tatsächlichen .NET-Typen auf der anderen Seite, wenn Sie also eine List<int> senden, wird die andere Seite eine List<int> erhalten.

Das offenbar besser funktioniert, wenn die andere Seite .NET ausgeführt wird.

Die XmlSerializer serialisiert die Art durch das Lesen Sie die Eigenschaften der alle Art, die sowohl einen öffentlichen Getter und einen öffentlichen Setter (und auch alle öffentlichen Felder) haben. In diesem Sinne ist die XmlSerializer serialisiert / deserialisiert die „Öffentlichkeit“ der Instanz.

Das binäre Formatierungsprogramm, dagegen serialisiert eine Art von der „Interna“ der Instanz Serialisierung, das heißt seine Felder. Alle Felder, die nicht markiert sind, als [NonSerialized] werden den binären Stream serialisiert werden. Die Art selbst muss als [Serializable] markiert werden müssen alle internen Felder, die auch serialisiert werden.

Ich denke, einer der wichtigsten ist, dass binäre Serialisierung sowohl öffentliche als auch private Mitglieder serialisiert werden kann, während der andere nur mit öffentlichen diejenigen arbeitet.

Hier bietet es einen sehr hilfreichen Vergleich zwischen diesen beide in Bezug auf Größe. Es ist ein sehr wichtiges Thema, weil Sie Ihre serialisiert Objekt zu einem Remote-Computer senden können.

http: //www.nablasoft.com/alkampfer/index.php/2008/10/31/binary-versus-xml-serialization-size/

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top