При изменении прото-поля на «повторяющееся» мне действительно нужно изменить связанный номер?

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

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

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

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

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

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

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

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

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

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

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

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

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


person George Mauer    schedule 05.05.2019    source источник


Ответы (1)


Из справочника по языку:

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

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

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

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

person Luc    schedule 07.05.2019
comment
Да, я думаю, что да, но потом мы перешли к разговору о самом формате сериализации. - person George Mauer; 08.05.2019