У меня есть прототипная схема, определенная ниже,
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.
Обновление: это изменилось недавно с повторным введением информации об отслеживании присутствия proto3 через новое значение ключевого слова optional
:
message User {
optional int64 id = 1;
optional bool email_subscribed = 2;
optional bool sms_subscribed = 3;
}
С этим изменением (теперь доступным в протоколах и т. д.) Явное присвоение передается, даже если это неявное значение по умолчанию.
Вы не можете использовать proto3. Лучше всего, вероятно, определить перечисление tri-bool с not-specified в качестве первого элемента с нулевым значением и некоторыми значениями true / false после этого.
Это потребует того же космос, что и protobuf bool
, но не будет двоично-совместимым, поэтому вы не можете просто изменить объявленный тип члена в существующих сообщениях. Что ж, я думаю, если вы сделаете true === 1, то, по крайней мере, это все еще будет работать - и для перехода вы должны ожидать, что false / not specified будет неоднозначным, пока вы не сбросите все старые данные.
Другой вариант - добавить элемент bool fooSpecified
для каждого bool foo
, но это занимает больше места и подвержено ошибкам из-за ручного управления.
Можете ли вы привести какой-нибудь пример для своего ответа?
@Vijendra, я могу лучше ... дай мне секунду ...
Другой вариант - использовать обертки с proto3. Они в основном заключают ваше значение в сообщение, поэтому в родительском сообщении его можно оставить пустым.
Таким образом, вы можете различать null / false / true в вашем поле bool с некоторой дополнительной работой.
Теперь это изменилось; см. обновление моего ответа