Прекращение пропусков значений по умолчанию в буферах протокола

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

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.

Теперь это изменилось; см. обновление моего ответа

Marc Gravell 09.04.2021 23:32
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
6
1
1 586
2

Ответы 2

Обновление: это изменилось недавно с повторным введением информации об отслеживании присутствия 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 Kumar Kulhade 09.04.2021 19:20

@Vijendra, я могу лучше ... дай мне секунду ...

Marc Gravell 09.04.2021 23:30

Другой вариант - использовать обертки с proto3. Они в основном заключают ваше значение в сообщение, поэтому в родительском сообщении его можно оставить пустым.

Таким образом, вы можете различать null / false / true в вашем поле bool с некоторой дополнительной работой.

Другие вопросы по теме