Frage

Hat jemand mit Erfahrung mit diesen Bibliotheken haben jeden Kommentar, auf denen man sie bevorzugt? Gab es irgendwelche Performance-Unterschiede oder Schwierigkeiten bei der Verwendung?

War es hilfreich?

Lösung

Ich habe um ein wenig mit beiden Systemen, nichts Ernstes gespielt, um nur einige einfache hackish Sachen, aber ich fühlte, dass es einen wirklichen Unterschied, wie man eigentlich sind die Bibliotheken verwenden.

Mit boost :: Serialisierung, können Sie Ihre eigene structs / Klassen schreiben zuerst, und dann die Archivierungsmethoden hinzufügen, aber Sie sind immer noch mit ein paar ziemlich „slim“ Klassen verlassen können, dass als Datenelemente verwendet werden, geerbt, was auch immer .

Mit Protokollpuffer, die Menge an Code selbst für eine einfache Struktur erzeugt wird, ist ziemlich beträchtlich, und die Strukturen und Code, der generiert wird ist mehr gemeint für den Betrieb auf, und dass Sie Protokollpuffer verwenden Funktionalität Daten zu und von transportieren Ihre eigene interne Strukturen.

Andere Tipps

Ich habe für eine lange Zeit Boost-Serialisierung wurde verwenden und nur in Protokollpuffer gegraben, und ich glaube, sie haben nicht den exakt gleichen Zweck. BS (nicht sehen, dass kommend) speichert Ihre C ++ Objekte zu einem Strom, während PB ein Austauschformat, das Sie vom / lesen.

PB des Datenmodells ist viel einfacher: Sie alle Arten von ints und Schwimmern erhalten, Strings, Arrays, Grundstruktur und das ist ziemlich viel es. BS können Sie alle Ihre Objekte in einem Schritt direkt speichern.

Das bedeutet, dass mit BS Sie mehr Daten auf dem Draht zu bekommen, aber Sie haben nicht alle Ihre Objekte Struktur neu zu erstellen, während Protokollpuffer kompakter sind, aber es ist mehr Arbeit nach der Lektüre des Archivs erfolgen. Wie der Name schon sagt, ist ein für Protokolle (sprachunabhängig, platzsparende Daten passing), die andere für die Serialisierung sind (no-brainer Objekte zu speichern).

Also, was Ihnen wichtiger ist: Geschwindigkeit / Raumeffizienz oder sauberen Code

Es gibt ein paar weitere Bedenken mit Boost.Serialization, die ich in den Mix werden. Caveat:. Ich habe keine direkte Erfahrung mit Protokoll-Puffer über die Dokumentation Skimming

Beachten Sie, dass, während ich boost denken, und Boost.Serialization, groß ist, was es tut, ich zu dem Schluss gekommen, dass die Standard-Archiv-Formate mit nicht eine gute Wahl für ein Draht-Format kommt sind.

Es ist wichtig, zwischen den Versionen von Klasse zu unterscheiden (wie erwähnt in anderen Antworten, hat Boost.Serialization eine gewisse Unterstützung für die Datenversionierung) und Kompatibilität zwischen verschiedenen Versionen der Serialisierung Bibliothek .

Neuere Versionen von Boost.Serialization das Protokoll Puffer Draht Format veröffentlichen, und Wikipedia beschreibt sie als vorwärts-kompatibel, abwärtskompatibel (obwohl ich glaube, Wikipedia bezieht sich auf Datenversionierung anstatt Protokollpuffer Bibliothek Versionierung). keines von beiden, während eine Garantie für vorwärts-Kompatibilität ist, es scheint wie ein stärkeren Anzeichen für mich.

Insgesamt Ich würde es vorziehen, ein bekanntes, veröffentlichtes Draht-Format wie Protokoll-Puffer, wenn ich nicht die Fähigkeit, Client & Server in Lockstep zu aktualisieren.

Fußnote:. Schamlose Werbung für einen bezogenen Antwort von mir

Boost-Serialisierung

  • ist eine Bibliothek für die Daten in einen Strom zu schreiben.
  • keine Daten komprimieren.
  • Unterstützung Daten nicht automatisch die Versionierung.
  • unterstützt STL-Containern.
  • Eigenschaften von Daten geschrieben sind abhängig von Strömen gewählt (z.B. endian, komprimiert).

Protocol Buffers

  • generiert Code von Schnittstellenbeschreibung (unterstützt C ++, Python und Java standardmäßig. C, C # und andere von 3rd-Party).
  • optional komprimiert die Daten.
  • Griffe Daten Versionierung automatisch.
  • Griffe Endian-Swapping zwischen den Plattformen.
  • nicht STL-Container unterstützen.

Boost-Serialisierung ist eine Bibliothek für ein Objekt in einen serialisierten Datenfluss umwandelt. Protocol Buffers das gleiche tun, sondern auch für Sie andere Arbeit zu tun (wie Versionierung und Endian-Swapping). Boost-Serialisierung ist einfacher für „kleine einfache Aufgaben“. Protocol Buffers sind wahrscheinlich besser für "größere Infrastruktur".

EDIT: 24-11-10: Hinzugefügt "automatisch" nach BS Versionierung

.

Ich habe keine Erfahrung mit Boost-Serialisierung, aber ich habe Protokollpuffer verwendet. Ich mag Protokoll viel puffert. Halten Sie die folgenden im Auge (das sage ich mit keine Kenntnisse von Boost).

  • Protokoll Puffer sind sehr effizient, damit ich nicht vorstellen , dass ein ernstes Problem gegen Auftrieb zu sein.
  • Protokollpuffer stellen eine Zwischendarstellung, die mit anderen Sprachen (Python und Java ... und mehr in Arbeit) arbeitet. Wenn Sie wissen, dass Sie nur C ++ verwenden, vielleicht steigern ist besser, aber die Möglichkeit, andere Sprachen zu verwenden, ist schön.
  • Protokollpuffer sind mehr wie Datencontainer ... es gibt keine objektorientierte Natur ist, wie Vererbung. Denken Sie an die Struktur von dem, was Sie wollen, serialisiert werden.
  • Protokollpuffer sind flexibel, weil Sie „optional“ Felder hinzufügen können. Diese im Grunde bedeutet, dass Sie die Struktur des Protokollpuffers ändern können, ohne die Kompatibilität zu brechen.

Hope, das hilft.

Boost.Serialization braucht nur den C ++ Compiler und gibt Ihnen einige Syntax Zucker wie

serialize_obj >> archive;
// ...
unserialize_obj << archive;

zum Speichern und Laden. Wenn C ++ die einzige Sprache ist, verwenden Sie sollten Sie einen ernsthaften Schuss geben Boost.Serialization.

Ich habe einen schnellen Blick auf Google Protokoll Puffer. Von dem, was ich sehe, würde ich sagen, dass es zu Boost.Serialization nicht direkt vergleichbar. Sie haben einen Compiler für die Proto-Dateien auf Ihre Werkzeugkette hinzuzufügen und die .proto Dateien selbst zu pflegen. Die API-Integration nicht in C ++ als Boost.Serialization tut.

Boost.Serialization hat den Zweck erfüllt seine für sehr gut gestaltet: C ++ Objekte serialisiert werden :) OTOH eine Abfrage-API wie Google Protokoll Puffer hat gibt Ihnen mehr Flexibilität.

Da ich nur Boost.Serialization verwendet, so weit kann ich nicht auf Leistungsvergleich kommentieren.

nach oben korrigiert (denke, das ist die Antwort ) über Boost-Serialisierung:

Es erlaubt die Unterstützung Daten Versionierung .

Wenn Sie die Komprimierung benötigen -. Verwenden, um einen komprimierten Strom

Kann Endian-Swapping zwischen Plattformen verarbeiten als Codierung Text, Binär- oder XML sein kann.

Ich habe nie etwas mit umgesetzt boost Bibliothek, aber ich fand die Google protobuff mehr durchdacht sein, und der Code ist viel sauberer und leichter zu lesen. Ich würde vorschlagen, einen Blick auf die verschiedenen Sprachen, die Sie damit verwenden möchten, und einen Lese durch den Code haben und die Dokumentation und Make up your mind.

Die einzige Schwierigkeit, die ich mit protobufs hatte, war sie eine sehr häufig verwendete Funktion in ihrem generierten Code GetMessage () genannt, was natürlich Konflikte mit dem Win32 GetMessage Makro.

Ich würde noch empfehlen protobufs. Sie sind sehr nützlich.

Wie bei fast allem im Maschinenbau, meine Antwort ist ... „es kommt.“

Beide sind gut getestet, geprüft Technologien. Beide werden Ihre Daten nehmen und es in etwas freundlich für das Senden von irgendwo. Beide werden wahrscheinlich schnell genug sein, und wenn Sie wirklich ein Byte hier oder dort zu zählen, sind Sie wahrscheinlich nicht gehen, glücklich zu sein mit entweder (seien sie ehrlich beide erstellten Pakete ein kleiner Bruchteil von XML oder JSON sein).

Für mich kommt es darauf an Workflow wirklich und ob Sie benötigen etwas anderes als C ++ am anderen Ende.

Wenn Sie zuerst Ihre Nachrichteninhalte, um herauszufinden, und Sie bauen ein System von Grund auf neu, verwenden Protocol Buffers. Sie können auf eine abstrakte Art der Nachricht denken und dann in den Code automatisch generieren, was auch immer Sie die gewünschte Sprache (3rd-Party-Plugins sind für fast alles vorhanden). Auch finde ich die Zusammenarbeit vereinfacht mit Protocol Buffers. Ich senden Sie einfach eine .proto Datei über und dann das andere Team hat eine klare Vorstellung davon, welche Daten übertragen werden. Ich verhängen auch auf ihnen nichts. Wenn sie Java verwenden möchten, gehen Sie vor!

Wenn ich schon eine Klasse in C gebaut ++ (und dies hat öfter passiert als nicht) und ich möchte nun, dass die Daten über den Draht senden, Erhöhung Serialisierung offensichtlich eine Tonne Sinn macht (vor allem, wenn ich bereits ein Boost Abhängigkeit woanders).

Sie können Boost-Serialisierung in enger Verbindung mit Ihren „echten“ Domain-Objekten verwenden und serialisiert die komplette Objekthierarchie (Vererbung). Protobuf nicht Vererbung unterstützen, so dass Sie die Aggregation verwenden haben. Leute behaupten, dass Protobuf für DTOs verwendet werden soll (Datentransfer-Objekte), und nicht für Kerndomäne Objekte selbst. Ich habe sowohl boost :: Serialisierung und protobuf verwendet. Die Leistung von boost :: Serialisierung sollte berücksichtigt werden, Getreide eine Alternative sein könnte.

Ich weiß, dass dies eine ältere Frage ist jetzt, aber ich dachte, dass ich meine 2 Pence in werfen würde!

Mit Auftrieb erhalten Sie die Möglichkeit, ich einige Datenvalidierung in Ihren Klassen ich schreiben; Das ist gut, weil die Datendefinition und die Kontrollen der Gültigkeit alle an einem Ort sind.

Mit GPB das Beste, was Sie tun können, ist Kommentare in der Proto-Datei zu setzen und hoffen gegen alle hoffen, dass wer auch immer benutzt es liest es, achtet auf sie, und setzt die Gültigkeit selbst überprüft.

Es erübrigt sich zu sagen, dies ist unwahrscheinlich und unzuverlässig, wenn Ihr auf jemand anderes am anderen Ende eines Netzstrom angewiesen dies als sich mit der gleichen Kraft zu tun. Plus, wenn die Einschränkungen auf Gültigkeit zu ändern, müssen mehrere Code-Änderungen geplant, koordiniert und durchgeführt.

So halte ich GPB für Entwicklungen ungeeignet sein, wo es wenig Gelegenheit, regelmäßig zu treffen und mit allen Teammitgliedern zu sprechen.

== == EDIT

Die Art der Sache, die ich meine, ist dies:

message Foo
{
    int32 bearing = 1;
}

Nun, wer ist zu sagen, was der gültige Bereich von bearing ist? Wir können haben

message Foo
{
    int32 bearing = 1;  // Valid between 0 and 359
}

Aber das ist abhängig von jemand anderem das Lesen und das Schreiben von Code für sie. Zum Beispiel, wenn Sie es bearbeiten und die Einschränkung wird:

message Foo
{
    int32 bearing = 1;  // Valid between -180 and +180
}

Sie sind völlig abhängig von jedem, der diese .proto Aktualisierung ihres Codes verwendet wird. Das ist unzuverlässig und teuer.

Mindestens mit Boost-Serialisierung sind Verteilen Sie eine einzelne C ++ Klasse, und das kann die Gültigkeit der Daten überprüft haben Recht hinein gebaut. Wenn diese Einschränkungen zu ändern, dann muß sonst niemand anderes jede Arbeit tun, als dafür, dass sie die gleiche Version des Quellcodes wie Sie verwenden.

Alternative

Es gibt eine Alternative: ASN.1. Dies ist sehr alt, hat aber einige wirklich, wirklich, handlich Dinge:

Foo ::= SEQUENCE
{
   bearing INTEGER (0..359)
}

Beachten Sie die Einschränkung. Also, wenn jemand diese .asn Datei verbraucht, generiert Code, landen sie mit dem Code auf, der automatisch, dass bearing überprüfen wird irgendwo zwischen 0 und 359. Wenn Sie die .asn-Datei aktualisieren,

Foo ::= SEQUENCE
{
   bearing INTEGER (-180..180)
}

alles, was sie tun müssen, ist neu kompilieren. Keine weiteren Änderungen am Code erforderlich sind.

Sie können auch tun:

bearingMin INTEGER ::= 0
bearingMax INTEGER ::= 360

Foo ::= SEQUENCE
{
   bearing INTEGER (bearingMin..<bearingMax)
}

Beachten Sie die <. Und auch in den meisten Werkzeuge der bearingMin und bearingMax können als Konstanten in den generierten Code erscheinen. Das ist äußerst nützlich.

Constraints kann sehr aufwendig sein:

Garr ::= INTEGER (0..10 | 25..32)

Sehen Sie in Kapitel 13 in diesem PDF ; es ist erstaunlich, was man tun kann;

Arrays können auch eingeschränkt werden:

Bar ::= SEQUENCE (SIZE(1..5)) OF Foo
Sna ::= SEQUENCE (SIZE(5)) OF Foo
Fee ::= SEQUENCE 
{
    boo SEQUENCE (SIZE(1..<6)) OF INTEGER (-180<..<180)
}

ASN.1 ist altmodisch, aber immer noch aktiv entwickelt, weit verbreitet ist (Ihr Mobiltelefon verwendet es viel), und weitaus flexibler als die meisten anderen Serialisierung Technologien. Über das einzige Manko, das ich sehen kann, ist, dass es keine anständige Code-Generator für Python. Wenn Sie mit C / C ++, C #, Java, ADA, dann sind Sie gut durch eine Mischung aus freien (C / C ++, ADA) und Gewerbe (C / C ++, C #, Java) Werkzeuge bedient.

Besonders gut gefällt mir die große Auswahl von binären und textbasierten wireformats. Dies macht es in einigen Projekten extrem komfortabel. Die wireformat Liste umfasst derzeit:

  • BER (binär)
  • PER (binär, ausgerichtet und nicht ausgerichtet. Das ist extrem wenig effizient. Zum Beispiel und INTEGER gezwungen zwischen 0 und 15 nur 4 bits auf dem Draht aufzunehmen)
  • OER
  • DER (eine andere binäre)
  • XML (auch XER)
  • JSON (brandneu, Tool-Unterstützung noch in der Entwicklung)

und andere.

Beachten Sie die letzten beiden? Ja, können Sie Datenstrukturen in ASN.1, Code generieren und auszusenden / verbrauchen Nachrichten in XML und JSON definieren. Nicht schlecht für eine Technologie, die in den 1980er Jahren begann.

Die Versionierung ist anders GPB getan. Sie können alleow für Erweiterungen:

Foo ::= SEQUENCE
{
   bearing INTEGER (-180..180),
   ...
}

Das bedeutet, dass ich zu einem späteren Zeitpunkt Foo hinzufügen kann, und ältere Systeme, die diese Version haben noch arbeiten kann (kann aber nur das bearing Feld zugreifen).

Ich rate ASN.1 sehr hoch. Es kann ein Schmerz zu behandeln (Werkzeuge könnten Geld kosten, der generierte Code ist nicht unbedingt schön, etc). Aber die Zwänge sind ein wirklich fantastisches Feature, das mir eine ganze Menge Herzschmerz immer wieder gerettet hat. Macht Entwickler viel jammern, wenn der Encoder / Decoder berichtet, dass sie nutzlose Daten generiert haben.

Weitere Links:

Beobachtungen

Daten gemeinsam nutzen:

  • Code erste Ansätze (zum Beispiel Boost-Serialisierung) beschränken Sie auf die Originalsprache (zum Beispiel C ++), oder Sie zwingen, eine Menge zusätzlicher Arbeit in einer anderen Sprache zu tun
  • Schema ist zuerst besser, aber
    • Viele dieser hinterlassen große Lücken in der gemeinsamen Nutzung Vertrag (das heißt keine Einschränkungen). GPB ist ärgerlich, in dieser Hinsicht, da es sonst sehr gut.
    • Einige Einschränkungen haben (zum Beispiel XSD, JSON), leiden aber lückenhaft Werkzeugunterstützung.
    • Zum Beispiel Microsofts xsd.exe ignoriert aktiv Einschränkungen in XSD-Dateien (MS Ausrede ist wirklich schwach). XSD ist gut (von den Zwängen Sicht), aber wenn man nicht dem anderen Kerl vertrauen kann ein gutes XSD-Tool zu verwenden, die sie für ihn / sie dann der Wert von XSD erzwingt vermindert
    • JSON Validatoren sind in Ordnung, aber sie tun nichts, Ihnen zu helfen, die JSON in erster Linie zu bilden und werden nicht automatisch aufgerufen. Es gibt keine Garantie, dass jemand Sie JSON Nachricht gesendet haben es durch einen Validator laufen. Sie müssen bedenken, es selbst zu überprüfen.
    • ASN.1-Tools alle scheinen die Einschränkungen Überprüfung zu implementieren.

für mich Also, ASN.1 tut es. Es ist derjenige, der am wenigsten wahrscheinlich ist in jemand anderes zu machen, einen Fehler zu führen, weil es das mit den richtigen Features ist und wo die Werkzeuge alle scheinbar bemüht, vollständig diese Funktionen zu implementieren, und es ist sprachneutral genug für die meisten Zwecke.

Um ehrlich zu sein, wenn GPB einen Zwang Mechanismus hinzugefügt, die der Sieger sein würde. XSD ist in der Nähe, aber die Werkzeuge sind fast überall Müll. Wenn es anständig waren Codegeneratoren von anderen Sprachen, würde JSON Schema ziemlich gut.

Wenn GPB hatten Einschränkungen hinzugefügt (Anmerkung: dies würde keine der Drähte Formate ändern), würde, dass derjenige sein, die ich für fast jeden Zweck jedem empfehlen würde. Obwohl ASN.1 der Uper ist sehr nützlich für Funkverbindungen.

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