Какой предпочтительный способ кодирования поля, допускающего значение NULL, в protobuf 2?

Я определяю сообщение ProtoBuf, в котором я хочу иметь поле, допускающее значение NULL, т.е. я хочу различать поле, имеющее значение, и поле, не имеющее значения. В качестве конкретного примера предположим, что у меня есть поля «x» и «y» для записи координат некоторого объекта. Но в некоторых случаях координаты неизвестны. Следующее определение будет не , потому что, если x или y не указаны, они по умолчанию равны нулю (что является допустимым значением):

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

Одним из вариантов может быть добавление логического поля, записывающего, соответствует ли соответствующее значение поля известно или нет. То есть: [

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

] Но это требует некоторого дополнительного учета - например, когда я устанавливаю значение поля x, я всегда должен не забывать также устанавливать has_x. Другой вариант - использовать значение списка с условием, что список всегда имеет либо длину 0, либо длину 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.
}

Но в этом случае определение кажется немного вводящим в заблуждение, и интерфейс не намного лучше.

Есть ли третий вариант, о котором я не думал лучше, чем эти два? Как вы справлялись с хранением полей, допускающих значение NULL, в protobuf?

8
задан mkjeldsen 26 January 2019 в 11:28
поделиться