Когда мне нужно изменить поле прото на `repeat`, нужно ли мне менять связанный номер? - PullRequest
0 голосов
/ 05 мая 2019

Допустим, у меня есть сообщение

message Something {
  int32 foo = 1;
  int32 bar = 2;
  string baz = 3;
}

и я хочу изменить baz на repeated string. Должен ли я на самом деле изменить номер? (Например до 4 и не рекомендуется 3).

Мы с другом обсуждаем это. Он более опытен в протофаффах (я новичок в этом деле), но из моего прочтения документов я на самом деле не понимаю, зачем это нужно.

Хотя в документах не рассматривается непосредственно проблема, с которой я столкнулся, я рассуждаю так:

Выше может сериализовать что-то вроде

0001(32bits)0011(utf-8bits)0010(32bits)

И десериализация в основном читала бы это как

  • о, хорошо, это 1, так что читайте следующие 32 бита
  • о хорошо, это 3, так что читайте следующие биты как utf-8
  • хм, следующий - 2, поэтому читайте следующие 32 как

Итак, согласно документу, когда вы добавляете repeated:

это поле может повторяться любое количество раз (включая ноль) в правильно сформированном сообщении

Что говорит мне о том, что фактическое число битов, которые мы читаем при обнаружении 3, не будет отличаться, мы просто можем столкнуться с несколькими тройками. Поэтому он является валидацией при сериализации и десериализации, но фактически не является частью кодировки.

Правильна ли эта логика? Могу ли я продолжать использовать один и тот же номер? Или я что-то упустил?

1 Ответ

1 голос
/ 07 мая 2019

Из языкового руководства:

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

(proto2: https://developers.google.com/protocol-buffers/docs/proto#updating)

Это верно для proto2, я бы сказал, что это относится и к proto3, даже если он не указан.Поведение должно состоять в том, что унаследованный код обработает список и сохранит в памяти последнее прочитанное значение.

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

...