2015-10-19 14 views
20

La versione proto2 di buffer protocollo consente di specificare i valori predefiniti per gli elementi del messaggio:Perché non ci sono valori predefiniti personalizzati in proto3?

optional double scaling_factor = 3 [default = 1.0]; 

Perché questo non è più possibile in proto3? Considero questa una funzionalità accurata per salvare byte aggiuntivi sul filo senza la necessità di scrivere alcun codice wrapper.

risposta

28

La mia comprensione è che proto3 non consente più di rilevare la presenza sul campo e non supporta più valori predefiniti diversi da zero perché ciò semplifica l'implementazione di protobuf in termini di "semplici vecchie strutture" in varie lingue, senza necessità di generare metodi di accesso. Questo è percepito come rendere Protobuf più facile da usare in quelle lingue.

(personalmente ritengo che le lingue che non dispongono di accesso e le proprietà non sono molto buoni lingue e protobuf non dovrebbe progettare davanti a loro, ma non è più il mio progetto.)

+0

Sembra un peccato che non possano semplicemente rilevare la presenza sul campo e applicare l'inadempimento contrattuale quando mancano. Questo di per sé dovrebbe essere agnostico del linguaggio. –

+2

@MeirionHughes - Credo che il problema si presenti quando si crea un nuovo oggetto, non fuori dal filo. Se la tua lingua non fornisce alcun concetto di costruttori e nessun concetto di accessor, non puoi inizializzare i campi ai valori predefiniti, indipendentemente dalla serializzazione. –

+0

Ma sicuramente puoi semplicemente assegnare i campi struct dopo la costruzione? Non riesco a pensare a nessuna ragione ragionevole per cui avresti un linguaggio che definisce le strutture non inizializzabili e immutabili ... –

0

Nel mio .pb.cc di file generato automaticamente vedo pochi posti come questo:

if (this->myint() != 0) { 

e pochi come questo:

myint_ = 0; 

Quindi, perché non abilitare il valore predefinito e generare

static ::google::protobuf::int32 myint_defaultvalue = 5; 

... 
if (this->myint() != myint_defaultvalue) { 
... 

... 
myint_ = myint_defaultvalue; 
... 

?