come has_field() metodi si riferiscono ai valori di default in protobuf?

Sto cercando di determinare la relazione tra valori di default e il has_foo() i metodi dichiarati in varie interfacce di programmazione. In particolare, sto cercando di determinare in quali circostanze (se del caso) si può “dire la differenza” tra un campo in modo esplicito il valore di default, e un unset valore.

  1. Se ho impostato in modo esplicito un campo (ad esempio “Bar.pippo”) al suo valore di default (ad esempio, zero), quindi è Bar::has_foo() rendimento garantito vero per che la struttura di dati? (Questo sembra essere vero per il C++ il codice generato, da un rapido controllo, ma questo non significa che non è garantito.) Se questo è vero, allora è possibile distinguere tra un esplicito valore di default impostato e un unset prima serializzazione.
  2. Se ho impostato in modo esplicito un campo al suo valore di default (ad esempio, lo zero), e quindi serializzare l’oggetto e inviare via cavo, sarà il valore di essere inviato o no? Se non è, allora è chiaro che il codice che riceve questo oggetto non può distinguere tra un esplicito valore di default impostato e un unset valore. I. e., non sarà possibile distinguere questi due casi dopo la serializzazione — Bar::has_foo() restituisce false in entrambi i casi.

Se non è possibile capire la differenza, qual è la tecnica consigliata per la codifica di una protobuf campo se voglio codificare un “annullabile” il valore opzionale? Un paio di opzioni che vengono in mente, ma nessuno sembra grande: (a) l’aggiunta di un ulteriore campo booleano che registra se il campo è impostato o non, o (b) l’uso di una “ripetizione” di campo, anche se ho semanticamente desidera un campo facoltativo — questo modo, mi può dire la differenza tra il valore di no (lunghezza-elenco di zero) o un valore impostato (lunghezza-un elenco).

 

One Reply
  1. 30

    Vale per ‘proto2’ di sintassi, non e ‘proto3’ :

    La nozione di un campo o non è un caratteristica principale di Protobuf. Se si imposta un campo per un valore qualsiasi valore), allora la corrispondente has_xxx metodo deve ritorna true, altrimenti c’è un bug nell’API.

    Se non si imposta un campo e poi serializzare il messaggio non viene inviato il valore per il campo. Lato di ricezione di analizzare il messaggio, scoprire che i valori in cui è incluso, e il corrispondente “has_xxx” valori.

    Esattamente come questo è implementato nel filo-formato è descritto qui: http://code.google.com/apis/protocolbuffers/docs/encoding.html. La versione breve è che il messaggio viene codificato come una sequenza di coppie chiave-valore, e solo i campi che sono esplicitamente set sono inclusi nel messaggio codificato.

    Valori di Default entrano in gioco solo quando si tenta di leggere un unset campo.

    • Grazie. Ma per essere chiari: (1) Se I esplicitamente impostare un campo per un valore (anche il suo valore di default), quindi has_xxx è vero; e (2) se ho la serializzazione di un protobuf oggetto, un campo verrà inviato il bonifico se has_xxx è vero, anche se il valore del campo è il valore di default?
    • Sì, è corretto.
    • Io non credo che sia corretto. Non dice da nessuna parte nella specifica documentazione collegata: (1) Un membro deve essere codificato in ogni caso, se il suo valore coincide con il valore predefinito. (2) Il protobuf attuazione deve consentire di distinguere tra un codificato valore predefinito predefinito), il valore impostato in fase di decodifica. Extra byte per inviare un tag vuoto + id sopra il filo quando la definizione su l’altra estremità ha già di default. Ulteriore documentazione anche stati “Se uno qualsiasi degli elementi sono opzionali, il messaggio codificato può o non può avere una coppia chiave-valore con che numero di tag.”
    • JesperE la risposta potrebbe essere stato vero in passato, ma sicuramente non è più vero.
    • Il comportamento è cambiato tra proto2 e proto3. Sotto proto3, non c’è più un concetto di “presenza”. Un campo è inviato il bonifico se e solo se non è pari al suo valore di default. (L’eccezione è il messaggio digitato campi, che seguono ancora la proto2 comportamento).

Lascia un commento