Performant Person Serialisierung: BSON-vs MessagePack (vs JSON)
Vor kurzem habe ich gefunden MessagePackeine alternative binäre Serialisierungsformat Google Protocol Buffers und JSON die auch übertrifft beide.
Da auch der BSON Serialisierungs-format, das von MongoDB für die Speicherung von Daten.
Kann jemand erläutern Sie das Unterschiede und die vor-und Nachteile von BSON-vs MessagePack?
Nur, um die komplette Liste der performante binäre Serialisierung Formate: Es gibt auch Klumpen die gehen, um den Nachfolger von Google ' s Protocol Buffers. Aber im Gegensatz zu allen anderen genannten Formate sind diejenigen, die nicht sprachunabhängig und verlassen Sie sich auf Gehen Sie gebaut ist-in Reflexion gibt es auch Gobs-Bibliotheken mindestens auf andere Sprache als die, die Gehen.
InformationsquelleAutor der Frage Alex | 2011-06-15
Du musst angemeldet sein, um einen Kommentar abzugeben.
//Bitte beachten Sie, dass ich bin Autor von MessagePack. Diese Antwort kann verzerrt werden.
Format design
Kompatibilität mit JSON -
Trotz seines namens, BSON-Kompatibilität mit JSON nicht so gut im Vergleich mit MessagePack.
BSON hat spezielle Typen wie "ObjectId", "Min " Taste", "UUID" oder "MD5" (ich denke, diese Typen sind erforderlich MongoDB). Diese Typen sind nicht kompatibel mit JSON. Es bedeutet, dass einige Typ-Informationen sind verloren, wenn Sie konvertieren von Objekten aus BSON zu JSON. Es kann sein, Nachteil, beide zu verwenden JSON und BSON in einzelnen service.
MessagePack ist entworfen, um transparent konvertiert von/nach JSON.
MessagePack ist kleiner als BSON -
MessagePack format ist weniger ausführlich als BSON. Als Ergebnis, MessagePack kann Objekte serialisieren, die kleiner als BSON.
Zum Beispiel eine einfache Karte {"a":1, "b":2} serialisiert wird in 7 bytes mit MessagePack, während BSON verwendet 19 bytes.
BSON unterstützt in-place-Aktualisierung
Mit BSON, die Sie ändern können Teil der gespeicherten Objekt ohne re-serializing gesamte Objekt. Nehmen wir an, eine Karte {"a":1, "b":2} in einer Datei gespeichert, und Sie möchten, aktualisieren Sie den Wert von "a" von 1 bis 2000.
Mit MessagePack, 1 verwendet nur 1 byte, aber 2000 verwendet 3 bytes. Also "b" muss nach hinten, die durch 2 bytes, während "b" wird nicht geändert.
Mit BSON, beide 1 und 2000 von 5 bytes. Wegen dieser Ausführlichkeit ist, brauchen Sie nicht, sich zu bewegen "b".
MessagePack hat RPC
MessagePack, Protocol Buffers, Sparsamkeit und Avro Unterstützung von RPC. Aber BSON nicht.
Diese Unterschiede bedeuten, dass MessagePack ist ursprünglich konzipiert für die Netzwerk-Kommunikation während der BSON ist konzipiert für den Speicher.
Implementierung und API-design
MessagePack hat die Typ-Prüfung-APIs (Java, C++ und D)
MessagePack unterstützt statische Typisierung.
Dynamische Typisierung verwendet, mit JSON oder BSON sind nützlich für dynamische Sprachen wie Ruby, Python oder JavaScript. Aber lästig für statische Sprachen. Sie müssen schreiben, langweilig Typ-checking-codes.
MessagePack bietet Typ-checking-API. Es wandelt dynamisch typisierte Objekte in statisch-typisierte Objekte. Hier ist ein einfaches Beispiel (C++):
MessagePack hat IDL
Es ist im Zusammenhang mit der Typ-checking-API, MessagePack unterstützt IDL. (die Spezifikation ist verfügbar unter: http://wiki.msgpack.org/display/MSGPACK/Design++IDL)
Protocol Buffers und Thrift erfordern IDL (nicht unterstützt dynamic-typing) und mehr Reife IDL-Implementierung.
MessagePack hat die streaming-API (Ruby, Python, Java, C++, ...)
MessagePack unterstützt streaming deserializers. Diese Funktion ist nützlich für Netzwerk-Kommunikation. Hier ist ein Beispiel (Ruby):
InformationsquelleAutor der Antwort Sadayuki Furuhashi
Ich weiß, dass diese Frage ist ein bisschen veraltet an dieser Stelle... ich denke, es ist sehr wichtig zu erwähnen, dass es hängt davon ab, was Ihre client - /server-Umgebung Aussehen.
Wenn Sie auf der Durchreise sind bytes mehrfach ohne Prüfung, wie mit einem message-queue-system oder streaming-log-Einträge auf die Festplatte, dann bevorzugen Sie vielleicht eine binäre Codierung zu betonen, die kompakte Größe. Ansonsten ist es ein Fall-zu-Fall-Problem mit verschiedenen Umgebungen.
Einigen Umgebungen können sehr schnell die Serialisierung und Deserialisierung von/aus msgpack/protobuf, andere nicht so sehr. Im Allgemeinen, desto niedriger die Ebene der Sprache/Umgebung das besser binäre Serialisierung funktioniert. In höheren Sprachen (node.js, .Net, JVM), wird man oft sehen, dass die JSON-Serialisierung ist tatsächlich schneller. Die Frage ist dann: ist Ihr Netzwerk-overhead mehr oder weniger eingeschränkt ist als dein Arbeitsspeicher/cpu?
Hinsichtlich msgpack vs bson-vs protocol buffers... msgpack ist die am wenigsten bytes der Gruppe, protocol buffers ungefähr das gleiche. BSON-definiert die Breite native Typen als die beiden anderen und kann eine bessere übereinstimmung mit den Objekt-Modus, aber das macht es Ausführlicher. Protokoll Puffer haben den Vorteil, dass Sie entwickelt, um Strom... das macht es eine Natürliche format für eine binäre übertragung/Speicherung-format.
Persönlich würde ich neigen zu der Transparenz, die das JSON-Angebote direkt, es sei denn, es gibt einen klaren Bedarf für einen leichteren Verkehr. Über HTTP mit Gzip-Daten, der Unterschied in der Netzwerk-overhead noch weniger ein Problem zwischen den Formaten.
InformationsquelleAutor der Antwort Tracker1
Quick-test zeigt minified JSON deserialisiert ist schneller als die binäre MessagePack. In den tests Artikel.json ist 550kb minified JSON, Artikel.mpack ist 420kb MP-version. Kann ein Umsetzung Problem natürlich.
MessagePack:
JSON:
So mal sind:
So ist der Platz gesichert, aber schneller? Nein.
Getestete Versionen:
InformationsquelleAutor der Antwort Oleksiy Khilkevich