2016-04-20 4 views
5

Ich muss Nachrichten an ein anderes Team mit der Proto2-Version von Google Protocol Buffers senden. Sie verwenden Java und C++ unter Linux. Ich verwende C# unter Windows.Proto2 vs Proto3 in C#

Jon Skeets protobuf-csharp-port (https://github.com/jskeet/protobuf-csharp-port) unterstützt Proto2. Wenn ich richtig verstanden habe, hat Google diesen Code genommen und eine aktualisierte Version davon in das Hauptprojekt protobuf (https://github.com/google/protobuf/tree/master/csharp) gefaltet. Aber es unterstützt nicht mehr Proto2 für C#, nur Proto3.

Ich bin mir nicht sicher, welches Projekt ich verwenden sollte. Es sieht so aus, als ob der neue besser unterstützt wird (Leistung, Unterstützung für Proto3, wenn das andere Team jemals Upgrades durchführt). Aber ich müsste die .proto-Datei, die ich erhalten hatte, von Proto2 nach Proto3 konvertieren und alle damit verbundenen Probleme riskieren.

Ich habe gelesen, dass zum größten Teil die Nachrichten für Proto2 und Proto3 kompatibel sind. Ich habe keine Erfahrung mit Protokoll-Puffer, aber die .proto-Datei, mit der ich arbeite, sieht ziemlich Vanille, keine Standardwerte oder oneof oder geschachteltes irgendetwas aus. Es scheint also so, als könnte ich einfach ihre "erforderlichen" und "optionalen" Schlüsselwörter löschen und die neue Bibliothek verwenden und diese als eine Proto3-Datei behandeln.

Ist es Ihrer Meinung nach die Mühe wert, die neuere Bibliothek zu verwenden? Gibt es eine Liste von Proto-Features, die die Proto2- und Proto3-Nachrichten inkompatibel machen würden?

Antwort

8

Wenn das andere Team über erforderliche Felder verfügt und Sie ihnen Nachrichten senden, ohne diese Felder anzugeben (oder sogar den Standardwert für Primitive explizit anzugeben), empfängt das andere Ende die Nachrichten nicht - sie werden nicht validiert .

Es gibt verschiedene Unterschiede zwischen proto2 und proto3 - einige auf der releases page aufgeführt sind:

Im Folgenden sind die wichtigsten neuen Funktionen in Sprachversion 3:

  • Entfernung von Feldpräsenz Logik für primitive Wertfelder, Entfernen erforderlicher Felder und Entfernen von Standardwerten. Dies erleichtert die Implementierung von proto3 mit offenen Strukturdarstellungen, wie in Sprachen wie Android Java, Objective C oder Go.
  • Entfernung von unbekannten Feldern.
  • Entfernen von Erweiterungen, die stattdessen durch einen neuen Standardtyp namens Any ersetzt werden.
  • Fix-Semantik für unbekannte Enum-Werte.
  • Hinzufügen von Karten.
  • Hinzufügen eines kleinen Satzes von Standardtypen zur Darstellung von Zeit, dynamischen Daten usw.
  • Eine wohldefinierte Kodierung in JSON als Alternative zur binären Proto-Kodierung.

Die Entfernung von unbekannten Feldern könnte ein wichtiges Thema für Sie sein - wenn das andere Team eine Meldung in die Lage erwartet mit einigen Feldern senden Ihr Code nicht bewusst ist, und Sie in der Lage sein, eine Rückkehr Nachricht an sie, diese Felder beizubehalten, könnte Proto3 Probleme für Sie darstellen.

Wenn Sie können Proto3 verwenden, würde ich vorschlagen, Proto3-Version zu verwenden, teilweise, da es richtige Unterstützung haben wird, während die Proto2-Version grundsätzlich im Wartungsmodus ist.Es gibt signifikante Unterschiede zwischen den beiden, hauptsächlich hinsichtlich der Veränderlichkeit - die generierten Nachrichtenklassen in der Codebasis von proto3 sind veränderbar, was für die unmittelbare Verwendbarkeit von Vorteil ist, aber in anderen Bereichen Herausforderungen darstellen kann.

+1

können immer noch nicht glauben, dass sie Standardeinstellungen loswerden :( –

+0

Der Sprachenführer für [Proto2] (https://developers.google.com/protocol-buffers/docs/proto) listet Karten als unterstützt versucht mit Proto-Compiler 3 mit [Proto3] (https://developers.google.com/protocol-buffers/docs/proto3#default) und es scheint zu ignorieren Felder mit Standardwerten (int mit 0 wurde aus binären und json entfernt – Manoj

+0

@Manoj: Ich denke, dass sie in gewissem Maße unterstützt wurden, aber nicht in allen Sprachen, und möglicherweise mit etwas anderer Semantik.Unsicher, was Sie meinen, "es scheint Felder zu ignorieren, die mit Standardwerten eingestellt sind." nur bedeuten "der Wert 0 ist nicht serialisiert" dann hast du recht. –