Wir haben gerade eine interne Studie über Serialisierer durchgeführt. Hier sind einige Ergebnisse (auch für meine zukünftige Referenz!).
Sparsamkeit = Serialisierung + RPC-Stapel
Der größte Unterschied besteht darin, dass Thrift nicht nur ein Serialisierungsprotokoll ist, sondern ein ausgewachsener RPC-Stack, der einem modernen SOAP-Stack ähnelt. So nach der Serialisierung, die Objekte könnten (aber nicht vorgeschrieben) zwischen Maschinen über TCP / IP gesendet werden. In SOAP haben Sie mit einem WSDL-Dokument begonnen, das die verfügbaren Dienste (Remotemethoden) und die erwarteten Argumente / Objekte vollständig beschreibt. Diese Objekte wurden über XML gesendet. In Thrift beschreibt die .thrift-Datei die verfügbaren Methoden vollständig, erwartete Parameterobjekte und die Objekte werden über einen der verfügbaren Serializer serialisiert (wobei Compact Protocol
ein effizientes Binärprotokoll in der Produktion am beliebtesten ist).
ASN.1 = Großvater
ASN.1 wurde in den 80er Jahren von Telekommunikationsleuten entwickelt und ist aufgrund der eingeschränkten Bibliotheksunterstützung im Vergleich zu den jüngsten Serialisierern, die von CompSci-Leuten entwickelt wurden, umständlich zu verwenden. Es gibt zwei Varianten, die DER-Codierung (binär) und die PEM-Codierung (ascii). Beide sind schnell, aber DER ist schneller und größeneffizienter. Tatsächlich kann ASN.1 DER Serializer, die 30 Jahre lang entwickelt wurden, problemlos aufrechterhalten (und manchmal schlagen)nach sich selbst ein Beweis für sein ausgereiftes Design. Es ist sehr kompakt, kleiner als Protocol Buffers und Thrift und wird nur von Avro geschlagen. Das Problem besteht darin, großartige Bibliotheken zu unterstützen, und im Moment scheint Bouncy Castle die beste für C # / Java zu sein. ASN.1 ist König in Sicherheits- und Kryptosystemen und wird nicht verschwinden. Machen Sie sich also keine Sorgen um die Zukunftssicherheit. Holen Sie sich einfach eine gute Bibliothek ...
MessagePack = Mitte des Pakets
Es ist nicht schlecht, aber es ist weder das schnellste noch das kleinste noch das am besten unterstützte. Kein Produktionsgrund, es zu wählen.
Verbreitet
Darüber hinaus sind sie ziemlich ähnlich. Die meisten sind Varianten des TLV: Type-Length-Value
Grundprinzips.
Protokollpuffer (von Google stammend), Avro (Apache-basiert, in Hadoop verwendet), Thrift (von Facebook, jetzt Apache-Projekt) und ASN.1 (von Telecom stammend) beinhalten alle eine gewisse Codegenerierungsebene, bei der Sie Ihre Daten zuerst in einem Serializer ausdrücken -spezifisches Format, dann generiert der Serializer "Compiler" über die code-gen
Phase Quellcode für Ihre Sprache . Ihre App-Quelle verwendet diese code-gen
Klassen dann für E / A. Beachten Sie, dass Sie mit bestimmten Implementierungen (z. B. der Avro-Bibliothek von Microsoft oder ProtoBuf.NET von Marc Gavel) Ihre POCO / POJO-Objekte auf App-Ebene direkt dekorieren können. Anschließend verwendet die Bibliothek diese dekorierten Klassen direkt anstelle der Klassen eines Code-Gens. Wir haben gesehen, dass dieses Angebot die Leistung steigert, da es eine Objektkopierphase eliminiert (von POCO / POJO-Feldern auf Anwendungsebene bis zu Feldern mit Code-Gen).
Einige Ergebnisse und ein Live-Projekt zum Spielen
Dieses Projekt ( https://github.com/sidshetye/SerializersCompare ) vergleicht wichtige Serializer in der C # -Welt. Die Java-Leute haben schon etwas Ähnliches .
1000 iterations per serializer, average times listed
Sorting result by size
Name Bytes Time (ms)
------------------------------------
Avro (cheating) 133 0.0142
Avro 133 0.0568
Avro MSFT 141 0.0051
Thrift (cheating) 148 0.0069
Thrift 148 0.1470
ProtoBuf 155 0.0077
MessagePack 230 0.0296
ServiceStackJSV 258 0.0159
Json.NET BSON 286 0.0381
ServiceStackJson 290 0.0164
Json.NET 290 0.0333
XmlSerializer 571 0.1025
Binary Formatter 748 0.0344
Options: (T)est, (R)esults, s(O)rt order, (S)erializer output, (D)eserializer output (in JSON form), (E)xit
Serialized via ASN.1 DER encoding to 148 bytes in 0.0674ms (hacked experiment!)