So definieren Sie ein optionales Feld in Protobuf 3

10

Ich muss eine Nachricht mit einem optionalen Feld in Protobuf angeben (Proto3-Syntax). In Bezug auf die Proto-2-Syntax lautet die Nachricht, die ich ausdrücken möchte, etwa:

%Vor%

Aus meiner Sicht wurde das "optionale" Konzept aus der Syntax-Proto-3 entfernt (zusammen mit dem erforderlichen Konzept). Obwohl es nicht klar ist, die Alternative - den Standardwert zu verwenden, um anzugeben, dass ein Feld nicht vom Absender angegeben wurde, hinterlässt eine Mehrdeutigkeit, wenn der Standardwert zur gültigen Wertedomäne gehört (z. B. einen booleschen Typ).

Also, wie soll ich die obige Nachricht verschlüsseln? Danke.

    
MaxP 06.03.2017, 09:34
quelle

2 Antworten

19

In Proto3 sind alle Felder "optional" (insofern es kein Fehler ist, wenn der Absender sie nicht setzen kann). Felder sind jedoch nicht mehr "nullbar", da es keinen Unterschied zwischen einem Feld gibt, das explizit auf seinen Standardwert gesetzt ist, oder überhaupt nicht.

Wenn Sie einen "Null" -Zustand benötigen (und es keinen Wert außerhalb des Bereichs gibt, den Sie dafür verwenden können), müssen Sie dies stattdessen als separates Feld kodieren. Zum Beispiel könnten Sie tun:

%Vor%

Alternativ können Sie oneof verwenden:

%Vor%

Die oneof Version ist expliziter und effizienter auf dem Draht, erfordert aber zu verstehen, wie oneof Werte funktionieren.

Schließlich ist eine andere vollkommen vernünftige Option, bei proto2 zu bleiben. Proto2 ist nicht veraltet, und tatsächlich hängen viele Projekte (einschließlich innerhalb von Google) sehr stark von Proto2-Features ab, die in Proto3 entfernt werden, daher werden sie wahrscheinlich niemals wechseln. Also, es ist sicher, es für die absehbare Zukunft zu verwenden.

    
Kenton Varda 06.03.2017, 20:11
quelle
1

Basierend auf Kentons Antwort sieht eine einfachere, aber funktionierende Lösung folgendermaßen aus:

%Vor%     
CyberSnoopy 19.10.2017 02:05
quelle