¿Cuál es la forma preferida de codificar un campo "anulable" en protobuf 2?

Estoy definiendo un mensaje ProtoBuf donde quiero tener un campo "anulable", es decir, quiero distinguir entre el campo que tiene un valor y no tiene un valor. Como ejemplo concreto, digamos que tengo los campos "x" e "y" para registrar las coordenadas de algún objeto. Pero en algunos casos, las coordenadas no se conocen. La siguiente definición serán work, porque si x o y no se especifican, entonces su valor predeterminado es cero (que es un valor válido):

message MyObject {
    optional float x = 1;
    optional float y = 2;
}

na opción sería agregar un campo booleano que registre si el valor del campo correspondiente es conocido o no. Es decir.

message MyObject {
    optional bool has_x = 1; // if false, then x is unknown.
    optional bool has_y = 2; // if false, then y is unknown.
    optional float x = 3; // should only be set if has_x==true.
    optional float y = 4; // should only be set if has_y==true.
}

Pero esto impone cierta contabilidad adicional; por ejemplo, cuando configuro el valor del campo x, siempre debo recordar configurar también has_x. Otra opción sería usar un valor de lista, con la convención de que la lista siempre tiene longitud 0 o longitud 1:

message MyObject {
    repeated float x = 1; // should be empty or have exactly 1 element.
    repeated float y = 2; // should be empty or have exactly 1 element.
}

Pero en este caso, la definición parece un poco engañosa, y la interfaz no es mucho mejor.

¿Existe una tercera opción que no haya pensado que sea mejor que estas dos? ¿Cómo ha tratado de almacenar campos anulables en protobuf?

Respuestas a la pregunta(4)

Su respuesta a la pregunta