Qual é a maneira preferida de codificar um campo "anulável" no protobuf

Estou definindo uma mensagem do ProtoBuf em que desejo ter um campo "anulável" - ou seja, quero distinguir entre o campo que tem um valor e não o valor. Como um exemplo concreto, digamos que eu tenho os campos "x" e "y" para registrar as coordenadas de algum objeto. Mas, em alguns casos, as coordenadas não são conhecidas. A seguinte definição será work, porque se x ou y não são especificados, eles serão padronizados como zero (que é um valor válido):

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

ma opção seria adicionar um campo booleano registrando se o valor do campo correspondente é conhecido ou não. I.e.

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.
}

Mas isso impõe alguma contabilidade extra - por exemplo, quando eu defino o valor do campo x, devo sempre lembrar também de definir has_x. Outra opção seria usar um valor de lista, com a convenção de que a lista sempre tem comprimento 0 ou comprimento 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.
}

Mas, neste caso, a definição parece um pouco enganadora e a interface não é muito melho

Existe uma terceira opção que eu não achei melhor do que essas duas? Como você lidou com o armazenamento de campos anuláveis no protobuf?

questionAnswers(4)

yourAnswerToTheQuestion