Protobuf обратная совместимость при изменении имени поля - PullRequest
0 голосов
/ 28 августа 2018

Если имя перечисления прото изменяется, оно обратно совместимо?

например, у меня это изначально:

enum ids {
  ID_1 = 1;
  ID_2 = 2; 
};


message {
  ids id = 1
};

И я изменяю определение перечисления на:

enum ids {
  ID_3 = 1;
  ID_2 = 2;
};

Совместимы ли старые прототипные сообщения с ID_1 с новым анализатором, скомпилированным из сообщения, содержащего ID_3?

1 Ответ

0 голосов
/ 28 августа 2018

Так как вы упомянули про proto3, у меня сначала пара замечаний.

Согласно документам proto3 , при определении перечисления вы всегда должны объявлять нулевое значение в качестве первой записи в списке значений перечисления. Это позволяет protobuf использовать 0 в качестве числового значения по умолчанию и для совместимости с семантикой proto2, где первое значение перечисления всегда является значением по умолчанию.

Что-то вроде:

enum ids {
  UNKNOWN = 0;
  ID_1 = 1;
  ID_2 = 2; 
};

На ваш первоначальный вопрос: замена метки на существующем значении перечисления, обратно совместимом, ответ - да и нет.

Он обратно совместим в отношении поведения по проводам. Предположим, что у службы есть более старая версия протокола с ID_1 = 1, а у клиента - более новая версия протокола с ID_3 = 1. Если сервер устанавливает ID_1 на своем конце, это означает, что значение 1 отправляется по сети. и будет интерпретироваться как ID_3 на стороне клиента.

Он не имеет обратной совместимости в том смысле, что когда ваш пересмотренный прототип будет скомпилирован на тот язык, который вы используете для его обработки, произойдет перерыв во время компиляции, если существовал код, который потреблял старую версию прототипа. потому что метка будет изменена с ID_1 на ID_3.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...