Formatos de Serialização de Dados Comparados: JSON, Protobuf, MessagePack
A serialização converte estruturas de dados num formato que pode ser armazenado ou transmitido e posteriormente reconstruído. A escolha do formato afeta o desempenho, o tamanho do payload, a interoperabilidade e a experiência do programador. Este guia compara as opções mais populares.
Visão Geral dos Formatos
| Formato | Tipo | Esquema | Legível por Humanos | Binário |
|---|---|---|---|---|
| JSON | Texto | Opcional (JSON Schema) | Sim | Não |
| Protocol Buffers | Binário | Obrigatório (.proto) | Não | Sim |
| MessagePack | Binário | Nenhum | Não | Sim |
| CBOR | Binário | Opcional (CDDL) | Não | Sim |
| Avro | Binário | Obrigatório (esquema JSON) | Não | Sim |
| YAML | Texto | Opcional | Sim | Não |
| XML | Texto | Opcional (XSD) | Sim | Não |
JSON: O Padrão Universal
O JSON é o formato de serialização mais amplamente utilizado, suportado nativamente nos navegadores e em virtualmente todas as linguagens de programação.
{
"name": "Alice",
"age": 30,
"roles": ["admin", "editor"],
"active": true
}
Pontos fortes: Suporte universal, legível por humanos, sem esquema obrigatório, excelente depuração. Pontos fracos: Verboso, sem suporte de dados binários, sem imposição de esquema, mais lento a analisar do que formatos binários. Tamanho: Este exemplo = 74 bytes.
Formate JSON com o nosso Formatador de JSON.
Protocol Buffers (Protobuf)
O formato de serialização binária da Google. Requer uma definição de esquema:
message User {
string name = 1;
int32 age = 2;
repeated string roles = 3;
bool active = 4;
}
Pontos fortes: Muito compacto, muito rápido, tipagem forte via esquema, compatibilidade retroativa/prospetiva, geração de código. Pontos fracos: Não legível por humanos, requer definição de esquema, requer etapa de geração de código, depuração mais difícil. Tamanho: Os mesmos dados ≈ 28 bytes (62% menor que JSON).
MessagePack
Um formato binário que é estruturalmente equivalente ao JSON — os mesmos tipos, sem esquema obrigatório:
const msgpack = require('msgpack-lite');
const packed = msgpack.encode({name: "Alice", age: 30, roles: ["admin", "editor"], active: true});
// Result: Buffer of ~45 bytes
Pontos fortes: Substituto direto do JSON (mesmo modelo de dados), menor que JSON, análise mais rápida, sem necessidade de esquema. Pontos fracos: Não legível por humanos, menos compacto que Protobuf, sem validação de esquema. Tamanho: Os mesmos dados ≈ 45 bytes (39% menor que JSON).
CBOR (Concise Binary Object Representation)
Uma norma IETF (RFC 8949) para dados binários. Objetivos semelhantes ao MessagePack mas com funcionalidades adicionais:
Pontos fortes: Norma IETF, suporta etiquetas para tipos estendidos (datas, BigInts), codificação determinística, bem adaptado a dispositivos com restrições (IoT). Pontos fracos: Ecossistema menor que o MessagePack, não legível por humanos. Tamanho: Semelhante ao MessagePack.
Apache Avro
Utilizado intensivamente em ecossistemas de big data (Hadoop, Kafka):
Pontos fortes: Evolução de esquema (adicionar/remover campos com segurança), codificação compacta, compressão integrada, excelente para streaming de dados. Pontos fracos: Requer esquema tanto para leitura como para escrita, menos adequado para APIs de pedido-resposta. Tamanho: Muito compacto quando o esquema é partilhado separadamente.
Comparação de Desempenho
Os benchmarks variam consoante a implementação, mas o desempenho relativo típico:
| Formato | Velocidade de Serialização | Velocidade de Desserialização | Tamanho |
|---|---|---|---|
| JSON | 1x (referência) | 1x (referência) | 1x (referência) |
| MessagePack | 2-4x mais rápido | 2-4x mais rápido | 0,6x |
| Protobuf | 3-10x mais rápido | 3-10x mais rápido | 0,3-0,5x |
| Avro | 2-5x mais rápido | 2-5x mais rápido | 0,3-0,5x |
| CBOR | 2-4x mais rápido | 2-4x mais rápido | 0,6x |
Os números reais dependem fortemente da estrutura dos dados, da implementação da linguagem e de se a compilação do esquema é amortizada.
Escolher o Formato Certo
Utilize JSON Quando:
- Construir APIs web (suporte no navegador é nativo)
- A legibilidade humana importa (ficheiros de configuração, depuração)
- A interoperabilidade é a prioridade (todas as linguagens suportam JSON)
- É necessária flexibilidade de esquema (estruturas de documentos variáveis)
Utilize Protobuf Quando:
- O desempenho é crítico (serviços de elevado débito)
- É necessária tipagem estrita (esquemas impostos)
- Controla tanto o produtor como o consumidor
- Utiliza gRPC para comunicação entre serviços
Utilize MessagePack Quando:
- Quer payloads menores sem sobrecarga de esquema
- É necessário um substituto direto do JSON
- Trabalha com linguagens que têm bom suporte de MessagePack
- Redis ou outros sistemas utilizam MessagePack nativamente
Utilize Avro Quando:
- Trabalha com pipelines de big data (Kafka, Hadoop)
- A evolução de esquema é importante
- Os dados são armazenados a longo prazo (o registo de esquemas ajuda leitores futuros)
Para converter entre formatos de texto, o nosso conversor JSON para YAML trata das necessidades de conversão mais comuns.
FAQ
Posso utilizar formatos binários em navegadores web?
Sim, mas com ressalvas. O MessagePack e o CBOR têm bibliotecas JavaScript que funcionam nos navegadores. O Protobuf requer a biblioteca protobufjs. No entanto, o JSON continua a ser o padrão para APIs web porque tem suporte nativo no navegador, funciona com fetch e é depurável no DevTools do navegador.
Devo mudar de JSON para Protobuf na minha API?
Apenas se tiver medido um estrangulamento de desempenho causado pela serialização JSON. Para a maioria das aplicações web, o JSON é suficientemente rápido e os benefícios de experiência do programador (legibilidade, depuração, ferramentas) superam os ganhos de desempenho dos formatos binários. O Protobuf brilha na comunicação de elevado débito entre microsserviços, não em APIs web típicas.
Recursos Relacionados
- Formatador de JSON — Formate e valide JSON
- YAML vs JSON — Comparação de formatos baseados em texto
- CSV vs JSON vs XML — Escolher formatos de troca de dados