Безопасность изменения номера протополя

Например, если я изменился с:

message Request {
  int foo = 1;
}

к

message Request {
  int bar = 1;
  int foo = 2;
}

Безопасно ли менять foo с 1 на 2? Документы запрещают: These numbers are used to identify your fields in the message binary format, and should not be changed once your message type is in use., но хотелось бы знать, почему.

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

Matteo 10.12.2020 10:34

Отвечает ли это на ваш вопрос? Могу ли я изменить пронумерованные теги в файле proto?

iammilind 27.09.2022 06:41
Стоит ли изучать 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 называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
8
2
2 509
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если у вас есть сериализованная версия сообщения, созданная с помощью первой версии, вы не сможете десериализовать вторую версию сообщения. Если вы используете protobuf для создания модели для хранения в БД или для публикации в брокере, таком как Apache Kafka, вам необходимо следовать соглашению. Если вы используете протобуфер для создания модели и сервиса для онлайн-использования, вы не должны ничего ломать (если вы будете перегенерировать все модели)

См. также зарезервированное ключевое слово , чтобы не использовать повторно старый номер. Дальнейшее чтение также здесь

Допустим, у меня есть библиотека A, владеющая прототипами, и библиотека B, использующая прототипы, такие как myRequest.foo. Если я изменю номер поля foo в библиотеке A, сломается ли библиотека B, если попытается обработать новый прототип со старым кодом?

onepiece 10.12.2020 13:43

@onepiece не должен сломаться (что означает: вызвать ошибку), если только старый код не знал о каком-то другом поле 2 с другим типом (поэтому удаление полей опасно, если вы не помечаете их как зарезервированные). Однако новая сериализация использует поле 1 для bar и 2 для foo; Таким образом, старый код сериализатора десериализует то, что было значениями бара, в поле с именем foo, а то, что было значением foo, будет потеряно (или сохранено в труднодоступном API как данные неизвестного поля). На проводе сохраняется только номер поля (не имя). По сути, не меняйте номера полей. Почти никогда.

Marc Gravell 10.12.2020 15:02

@MarcGravell Можно ли изменить номера полей, если, скажем, прототип принадлежит и используется только в библиотеке A? Затем все варианты использования прототипа будут обновлены вместе. Я также видел stackoverflow.com/a/26826460/1661745 - if you change the numbering scheme, and apply this change to both serializer and deserializer, there is no issue.

onepiece 10.12.2020 19:03

@onepiece, который зависит: у вас есть полезные данные, хранящиеся в файлах? В базах данных? В очередях сообщений? Если ответ на любой из этих (и других) вопросов «возможно», то нет, это не нормально. Откровенно говоря, меняя номер поля, вы абсолютно ничего не выигрываете, а рискуете очень сильно. Для меня это много слов и потраченного впустую времени, которое можно сэкономить, просто оставив поле в покое. Никто не будет возражать.

Marc Gravell 10.12.2020 19:44

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