Perché Protobuf 3 ha reso facoltativi tutti i campi sui messaggi?

6

La sintassi 3 di protobuf ha reso tutti i campi facoltativi eliminando le parole chiave required e optional dalla precedente sintassi di proto2. Leggendo alcuni commenti degli sviluppatori sembra che sia stato fatto per migliorare la compatibilità binario avanti / indietro.

Ma per me, questo potrebbe essere applicato solo eseguendo il versioning dei nomi dei pacchetti, diciamo com.example.messages.v1 e poi permettiamo ai client di implementare i deserializzatori che capiscono. Allo stesso tempo rimuove alcuni contratti dichiarati come un tipo che è utile dal punto di vista dell'ingegneria del software. Ad esempio, se ho

message Location {
   double latitude = 1;
   double longitude = 2;
}

In proto3 è possibile creare un mezzoLocation mezzo sostenuto ma non valido non fornendo uno dei campi richiesti.

Non è un grosso svantaggio quando si crea un formato di serializzazione basato sullo schema per lo scambio di dati tra client? Non è peggio spostare un codice di convalida aggiuntivo su ciascun client controllando che tutti i campi obbligatori abbiano valori validi?

    
posta tonicebrian 08.06.2017 - 11:06
fonte

1 risposta

6

proto3 rende un numero di modifiche mirate (a quanto ho capito) per renderlo molto più utilizzabile in scenari multipiattaforma. Il tracciamento esplicito di "assegnato" a "non assegnato ma riportante il valore predefinito" può essere molto difficile da implementare su alcune piattaforme di destinazione e può anche essere fonte di confusione da utilizzare. In quanto tale, proto3 adotta un approccio molto più semplice:

  • il valore predefinito implicito è il valore zero naturale (numeri / enumeri), falso (booleani) o stringa vuota (stringhe)
  • solo l'impostazione implicita è consentita; nessun altro valore predefinito è consentito
  • se un campo ha quel valore predefinito, non è serializzato; non importa se è stato assegnato esplicitamente a zero / false / empty-string vs mai assegnato
  • per questo motivo non esiste il concetto di "obbligatorio", poiché "esplicitamente assegnato un valore zero" e "mai assegnato un valore" sembrano identici

In proto3 it is possible to create a half backed but perfectly valid Location by not providing one of the required fields.

L'altro valore è: zero. Il fatto che tu non abbia esplicitamente lo assegni a zero è discutibile. Che sia o meno desiderabile dipende da te, ma per me ha senso ed è come molte "inizializzare un nuovo oggetto / struttura" funziona su una vasta gamma di piattaforme.

Isn't worse to move extra validation code to each client checking that all required fields have valid values?

Non c'è niente da convalidare! Il layout è esattamente quello che sarebbe se il valore zero fosse assegnato esplicitamente. Se ciò è legale, è legale. Se è illegale (perché zero non ha senso per te), è illegale; ma sarebbe illegale se fosse esplicito o implicito. La quantità di convalida coinvolta non cambia.

Isn't that a big drawback when creating a schema based serialization format for exchanging data between clients?

Di solito no, no ... soprattutto perché la versione dello schema è esplicita. Se vuoi usare proto2: usa proto2. Niente cambia automaticamente.

    
risposta data 08.06.2017 - 14:48
fonte

Leggi altre domande sui tag