Каково значение перечисления, если оно требуется, но не в диапазоне? - PullRequest
3 голосов
/ 30 декабря 2011

Приложение A использует этот файл прото *

message The_message
{
   enum The_enum
   {
      one = 1;
      two = 2;
   }

   required The_enum the_enum = 1;
}

Приложение B использует следующую версию файла.Он аналогичен, за исключением того, что у него есть еще одно поле enum

three = 3;

Что произойдет, если приложение B отправит сообщение приложению A, используя three enum?

Документация protobuf говорит

если вы попытаетесь указать другое значение, парсер будет обрабатывать его как неизвестное поле

Таким образом, перечисление three становится неизвестным полем,Что было бы хорошо, если бы the_enum было необязательным, но это обязательное поле.
Сможет ли приложение A правильно проанализировать сообщение?
Разве перечисления не предназначены для расширения таким образом?

1 Ответ

3 голосов
/ 30 декабря 2011

Я ожидаю, что парсер будет вести себя так же, как если бы он обнаружил сообщение, в котором отсутствует поле required. Я ожидаю, что парсер отклонит сообщение.

На странице, на которую вы ссылались, написано:

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

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


Если поле типа enum не было required, то из документации следует, что это поле будет считаться неизвестным. Если бы вы использовали версию API protobuf, которая его поддерживала, вы могли бы получить доступ к этому полю / значению, но вы бы увидели его как байты или что-то еще, а не как сопоставленный тип Java или C # enum.

...