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ánã 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?