Можно ли изменить необязательное поле proto3 на повторное, не нарушая совместимость проводов?

Допустим, у меня есть сообщение proto3, определенное следующим образом, для использования в качестве запроса gRPC (то есть с использованием двоичного кодирования protobuf):

message MyRequest {
  string name = 1;
}

Могу ли я изменить свой сервер (т. Е. Программу чтения сообщений), чтобы использовать следующее определение, не нарушая совместимость проводов для существующих клиентов (т. Е. Авторов)?

message MyRequest {
  repeated string names = 1;
}

В руководстве по языку proto2 я вижу следующее:

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

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

1 ответ

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

Другие вопросы по тегам