Die Syntax 3 von protobuf machte alle Felder optional required
und optional
löschte die Schlüsselwörter und aus der vorherigen Proto2-Syntax. Einige Kommentare von Entwicklern lassen vermuten, dass dies zur Verbesserung der binären Vorwärts- / Rückwärtskompatibilität getan wurde.
Aber für mich könnte das durchgesetzt werden, indem einfach die Paketnamen versioniert werden com.example.messages.v1
und dann die Clients Deserialisierer implementieren, die sie verstehen. Gleichzeitig werden einige Verträge entfernt, die aus Sicht der Softwareentwicklung als nützlich eingestuft werden. Zum Beispiel, wenn ich habe
message Location {
double latitude = 1;
double longitude = 2;
}
In proto3 ist es möglich, ein halbgesichertes, aber vollkommen gültiges Feld zu erstellen, Location
indem eines der erforderlichen Felder nicht angegeben wird.
Ist das nicht ein großer Nachteil beim Erstellen eines schemabasierten Serialisierungsformats für den Datenaustausch zwischen Clients? Ist es nicht schlimmer, zusätzlichen Validierungscode auf jeden Client zu verschieben und zu überprüfen, ob alle erforderlichen Felder gültige Werte enthalten?
quelle
Antworten:
proto3 nimmt eine Reihe von Änderungen vor, die darauf abzielen (wie ich es verstehe), es in plattformübergreifenden Szenarien viel benutzerfreundlicher zu machen . Die explizite Verfolgung von "zugewiesen" und "nicht zugewiesen", aber das Melden des Standardwerts "kann auf einigen Zielplattformen sehr schwierig zu implementieren und auch verwirrend sein. Aus diesem Grund geht proto3 viel einfacher vor:
Der andere Wert ist: Null. Die Tatsache, dass Sie es nicht explizit auf Null gesetzt haben, ist umstritten. Ob dies wünschenswert ist oder nicht, liegt bei Ihnen, aber für mich ist es sinnvoll, wie viel "Initialisieren eines neuen Objekts / einer neuen Struktur" auf einer Vielzahl von Plattformen funktioniert.
Es gibt nichts zu validieren! Das Layout ist genau das, was es wäre, wenn der Wert Null explizit zugewiesen würde. Wenn das legal ist, ist es legal. Wenn es illegal ist (weil Null für Sie keinen Sinn ergibt), ist es illegal. aber es wäre illegal, ob es explizit oder implizit war. Der Umfang der Validierung ändert sich nicht.
Nicht normalerweise, nein ... zumal die Schemaversion explizit ist. Wenn Sie proto2 verwenden möchten: Verwenden Sie proto2. Nichts ändert sich automatisch.
quelle