Tenho duas versões de uma mensagem protobuf e queria ver se a versão mais antiga (para clientes que não estão atualizados) é compatível com a versão mais recente.
Versão antiga:
message Foo {
bool some_boolean_field = 1;
}
Versão mais recente:
message Foo {
enum SomeEnum {
A = 0;
B = 1;
C = 2;
}
oneof oneof_field {
bool some_boolean_field_in_oneof = 1;
SomeEnum some_enumeration_field_in_oneof = 2;
}
}
Há um campo na versão mais antiga chamado some_boolean_field
, eu queria que ele fosse renomeado e também estivesse em um oneof
campo com outro campo. A versão mais nova é compatível com a versão mais antiga?
Supondo que você esteja usando o formato binário (em vez do formato JSON), então: sim, está tudo bem.
no formato de carga binária, nomes não existem - apenas números de campo, então: sim, não fará diferença renomear
some_boolean_field
parasome_boolean_field_in_oneof
- ambos são apenas o campo 1 para o formato.oneof
não existe no formato de carga binária - eles são apenas campos onde acontece que no máximo um estará presente; não há nenhuma camada estrutural adicional introduzida pela adição de umoneof
, então adicionaroneof
campos adicionais ou alterar um campo regular existente para ser umoneof
campo com o mesmo número e novos campos: também está bom.Alterações que não são seguras no formato binário incluem: alterar o tipo de dados, alterar o número do campo, uso de
required
(em proto2). Alterar entre um unário erepeated
um campo não é estritamente uma quebra (especialmente ao adicionarrepeated
), mas pode causar confusão.Se você estiver usando o formato JSON, ao renomear um campo, talvez seja necessário usar o
json_name
marcador opcional no esquema para preservar o nome antigo no JSON e evitar perda de dados.