Прекращение пропуска значений по умолчанию в буферах протокола - PullRequest
0 голосов
/ 02 мая 2018

У меня есть схема прото, определенная как показано ниже,

message User {
   int64 id = 1;
   bool email_subscribed = 2;
   bool sms_subscribed = 3;
}

Теперь в соответствии с официальной документацией proto3 значения по умолчанию не сериализуются для экономии места во время проводной передачи. Но в моем случае я хочу получить информацию о том, что клиент явно установил true/false для полей email_subscribed/sms_subscribed (поскольку раньше значения были true, а теперь пользователь хочет отписаться). Следовательно, когда клиент отправляет false для любого из этих полей, сериализатор кода генератора просто пропускает эти поля.

Как мне добиться этого и избежать пропуска этих полей для вышеуказанного сценария?

PS: я использую Javascript в качестве клиента GRPC, а также Python и GRPC Server.

1 Ответ

0 голосов
/ 02 мая 2018

Вы не можете под proto3. Лучше всего, вероятно, определить перечисление tri-bool с неопределенным значением в качестве первого элемента со значением ноль и некоторыми значениями true / false после этого.

Это потребует того же пробела , что и protobuf bool, но не будет двоично-совместимым - поэтому вы не можете просто изменить объявленный тип элемента в существующих сообщениях. Ну, я думаю, что если вы сделаете true === 1, то, по крайней мере, это все еще работает - и для перехода вы должны ожидать, что ложное / не указано неоднозначное значение, пока вы не сбросите все старые данные.

Другой вариант - добавить элемент bool fooSpecified для каждого bool foo, но он занимает больше места и подвержен ошибкам из-за ручной настройки.

...