Можно ли изменить необязательное поле 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
с одним элементом одинаковы. Однако это изменение может сбить с толку читателей кода, поскольку не сразу очевидно, что сообщение может быть интерпретировано таким образом.