protocol protobuffers protobuf google buffers array protocol-buffers

protocol-buffers - protobuffers - protocol buffer list



¿Cómo se relacionan los métodos has_field() con los valores predeterminados en protobuf? (1)

Lo siguiente se aplica a la sintaxis ''proto2'', no a ''proto3'':

La noción de un campo que se establece o no es una característica fundamental de Protobuf . Si establece un campo en un valor (cualquier valor), entonces el método has_xxx correspondiente debe devolver verdadero, de lo contrario tiene un error en la API.

Si no establece un campo y luego serializa el mensaje, no se envía ningún valor para ese campo. El lado receptor analizará el mensaje, descubrirá qué valores se incluyeron y configurará los valores "has_xxx" correspondientes.

Aquí se documenta exactamente cómo se implementa esto en el formato cableado: http://code.google.com/apis/protocolbuffers/docs/encoding.html . La versión corta es que el mensaje se codifica como una secuencia de pares clave-valor, y solo los campos que se establecen explícitamente se incluyen en el mensaje codificado.

Los valores predeterminados solo entran en juego cuando intentas leer un campo sin establecer.

Estoy tratando de determinar la relación entre los valores predeterminados y los métodos has_foo () que se declaran en varias interfaces programáticas. En particular, estoy tratando de determinar bajo qué circunstancias (si las hay) usted puede "decir la diferencia" entre un campo establecido explícitamente en el valor predeterminado y un valor no establecido.

  1. Si establezco explícitamente un campo (por ejemplo, "Bar.foo") a su valor predeterminado (por ejemplo, cero), ¿se garantiza que Bar :: has_foo () sea verdadero para esa estructura de datos? (Esto parece ser cierto para el código generado por C ++, a partir de una inspección rápida, pero eso no significa que esté garantizado). Si esto es cierto, entonces es posible distinguir entre un valor predeterminado establecido explícitamente y un no establecido antes de la serialización .

  2. Si configuro explícitamente un campo a su valor predeterminado (por ejemplo, cero), y luego serializo ese objeto y lo envío por cable, ¿se enviará o no el valor? Si no es así, entonces claramente cualquier código que reciba este objeto no puede distinguir entre un valor predeterminado establecido explícitamente y un valor no establecido. Es decir, no será posible distinguir estos dos casos después de la serialización : Bar :: has_foo () devolverá false en ambos casos.

Si no es posible notar la diferencia, ¿cuál es la técnica recomendada para codificar un campo protobuf si quiero codificar un valor opcional "anulable"? Un par de opciones me vienen a la mente, pero ninguna me parece genial: (a) agregue un campo booleano adicional que registre si el campo está configurado o no, o (b) use un campo "repetido" aunque semánticamente quiera un campo opcional - De esta manera puedo decir la diferencia entre ningún valor (lista de longitud cero) o un valor establecido (lista de longitud uno).