Так как вы упомянули про 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.
Надеюсь, это поможет.