1001Ferramentas
📡Dev

gRPC Reserved Fields Builder

Gera cláusula "reserved" para .proto a partir de uma lista de números de campos.

Cláusula proto

Reservar números de campo removidos em Protocol Buffers

Em Protocol Buffers, o que identifica um campo na codificação binária é o número, não o nome. Remover um campo e mais tarde reaproveitar aquele número faz o novo campo receber os bytes do antigo — sem erro, sem aviso, com o valor errado no lugar certo. A palavra-chave de reserva existe para tornar isso impossível: o compilador recusa qualquer tentativa de reusar um número reservado.

Informe os números ou faixas removidos e a página monta a declaração. Faixas usam hífen, e vários itens são separados por vírgula. Vale reservar também o nome do campo, numa declaração separada, para o caso de alguém recriar um campo com o mesmo nome e outro número — o que confunde quem lê o esquema mas não quebra a codificação.

A regra prática é reservar sempre que remover, mesmo em esquema interno. O custo é uma linha; o custo de não fazer é um bug de dados que aparece só depois que as duas versões do esquema convivem em produção, e que é dos mais difíceis de rastrear, porque o valor chega íntegro e no campo errado. Vale lembrar que os números de 19000 a 19999 já são reservados pelo próprio protocolo.

Perguntas frequentes

Preciso reservar o nome também?
A codificação não usa o nome, então recriar um campo com nome antigo e número novo não corrompe dado. Mas confunde quem lê o esquema e quebra ferramentas que serializam em JSON, onde o nome importa. Reservar os dois é a prática recomendada, em declarações separadas.
Qual a diferença entre reservar e marcar como obsoleto?
Reservar remove o campo do esquema e proíbe o número. Marcar como obsoleto mantém o campo e apenas sinaliza aos geradores de código que ele não deve ser usado — o campo continua sendo serializado. Obsoleto é para transição; reservar é para depois da remoção.
Que números devo evitar?
A faixa de 19000 a 19999 é reservada pelo protocolo e o compilador recusa. Vale também lembrar que números de 1 a 15 ocupam um byte a menos na codificação — devem ficar para os campos mais frequentes, e não devem ser gastos em campo raro.

Ferramentas Relacionadas