2012-05-01 1 views
27

Одной из привлекательных особенностей буферов протокола является то, что он позволяет расширять определения сообщений без нарушения кода, использующего более раннее определение. В случае перечисления according to the documentation:Как создать для будущего дополнительного значения перечисления в буферах протокола?

поле с перечислимого типа может иметь только один из заданного набора констант как его значение (если вы пытаетесь представить другое значение, анализатор будет относиться к ней как к неизвестное поле)

поэтому, если вы расширяете перечисление и используете новое значение, тогда поле с этим типом в старом коде будет неопределенным или будет иметь значение по умолчанию, если оно есть.

Что такое хорошая стратегия для решения этой проблемы, зная, что в будущем у перечисления могут быть добавлены дополнительные значения?

Один из способов, который приходит на ум, состоит в том, чтобы определить «неопределенный» член перечисления и сделать это по умолчанию, а затем старый код будет знать, что ему было отправлено то, что он не может интерпретировать. Разве это разумно, есть ли лучшие способы справиться с этой ситуацией?

+0

Следующее решение состоит в том, чтобы никогда не добавлять значения в существующее перечисление, а вместо этого добавлять новый. – glennr

+1

Из кода, который я смотрел сегодня (Java), не ясно, что значение по умолчанию помогает. Поле enum уже имеет значение по умолчанию (первое значение перечисления), но это значение назначается и отменяется. Таким образом, isInitialized() терпит неудачу, потому что сканирование требуемых полей видит, что hasField boolean является ложным. Enum, required, extendable - выбрать любые два? – VoiceOfUnreason

+0

@VoiceOfUnreason: Правильно: если вы сделаете необходимое перечисление, непредвиденные значения будут считаться несовместимыми. По умолчанию используется только если он не является обязательным. – poolie

ответ

18

Да, лучший подход - сделать первое значение в перечислении что-то вроде UNKNOWN = 0. Тогда старые программы, читающие protobuf с значением перечисления, которое они не распознают, будут видеть его как UNKNOWN и, надеюсь, они смогут справиться с этим разумно, например, пропуская этот элемент.

Если вы хотите сделать это, вы также захотите сделать перечисление optional не required.

required, как правило, означает «Я предпочел бы, чтобы программа просто прерывалась, чем обрабатывала то, что она не понимает».

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

 Смежные вопросы

  • Нет связанных вопросов^_^