Outros Formatos
Serde se integra a muitos formatos de comunicação além do JSON - cada crate implementa os mesmos traits Serialize/Deserialize.
Receita
Cartão de receita de referência rápida - pronto para copiar e colar.
use serde::{Deserialize, Serialize};
#[derive(Serialize, Deserialize)]
struct Config { host: String, port: u16 }
let toml_str = toml::to_string(&config)?;
let yaml_str = serde_yaml::to_string(&config)?;
let bytes = bincode::serde::encode_to_vec(&config, bincode::config::standard())?;Quando usar isso: Escolha o formato que corresponde ao seu consumidor - arquivos de configuração humanos, RPC compacto ou mensagens entre linguagens.
Exemplo de Trabalho
use serde::{Deserialize, Serialize};
#[derive(Debug, Serialize, Deserialize, PartialEq)]
struct Config {
host: String,
port: u16,
#[serde(default)]
workers: u32,
}
fn main() -> Result<(), Box<dyn std::error::Error>> {
let cfg = Config { host: "127.0.0.1".into(), port: 3000, workers: 4 };
let toml_text = toml::to_string(&cfg)?;
let from_toml: Config = toml::from_str(&toml_text)?;
let yaml_text = serde_yaml::to_string(&cfg)?;
let from_yaml: Config = serde_yaml::from_str(&yaml_text)?;
let bytes = bincode::serde::encode_to_vec(&cfg, bincode::config::standard())?;
let (from_bin, _len): (Config, usize) =
bincode::serde::decode_from_slice(&bytes, bincode::config::standard())?;
assert_eq!(from_toml, from_bin);
Ok(())
}O que isso demonstra:
- A mesma struct serializa para TOML, YAML e bincode sem alterações.
- O atributo
defaultajuda os arquivos de configuração a omitir chaves opcionais. - bincode produz binários compactos para armazenamento de serviço a serviço.
Mergulho Profundo
Guia de Formatos
| Formato | Crate | Uso Típico |
|---|---|---|
| TOML | toml | Cargo.toml, configuração de app |
| YAML | serde_yaml | Manifestos K8s, configs de CI |
| MessagePack | rmp-serde | RPC multilíngue compacto |
| bincode | bincode | Blobs de cache nativos Rust |
Notas Rust
// MessagePack
let mut buf = Vec::new();
rmp_serde::encode::write(&mut buf, &cfg)?;Armadilhas
- Segurança YAML - YAML arbitrário pode ser complexo de analisar com segurança. Correção: Trate YAML apenas como configuração confiável; prefira TOML para aplicativos.
- bincode não é portátil entre linguagens - O layout binário é centrado em Rust. Correção: Use JSON, Protobuf ou MessagePack para sistemas políglotos.
- Tipos específicos de formato -
toml::Valuevsserde_json::Valuediferem. Correção: Mantenha structs compartilhadas nas fronteiras. - Representação de enum difere - A forma JSON de enum com tag != layout bincode. Correção: Teste o round-trip para cada formato em CI.
- Aliases YAML grandes - Ataque "billion laughs". Correção: Limite a profundidade/tamanho do carregador em contextos não confiáveis.
Alternativas
| Alternativa | Use Quando | Não Use Quando |
|---|---|---|
| JSON | APIs Universais | Configuração editada por humanos com comentários |
| Protobuf | Contratos gRPC | Configuração rápida de CLI |
| Postcard | Embutido no_std | Padrões de servidor desktop |
FAQs
TOML vs JSON para configuração?
TOML suporta comentários e é mais amigável para arquivos editados por operações.
MessagePack vs bincode?
MessagePack para pares não-Rust; bincode para caches apenas-Rust.
Uma struct pode servir para todos os formatos?
Sim, se você evitar atributos específicos de formato conflitantes - teste cada formato.
YAML em produção?
Aceitável para configurações de implantação confiáveis; nunca para uploads de usuário não confiáveis.
Versão de blobs bincode?
Prefira um byte de versão de esquema ou use migração explícita na leitura.
crate serde_with?
Auxiliares extras para durações, timestamps entre formatos.
CSV?
serde + crate csv para dados tabulares, separado desta lista.
Avro?
Pilhas de registro de esquema usam apache-avro com um modelo de geração de código diferente.
Flags de recursos?
Dependências opcionais por crate de formato para manter binários pequenos.
Benchmarking de formatos?
bincode/MessagePack ganham em tamanho; JSON ganha em interoperabilidade.
Relacionados
- Fundamentos do Serde - Fundamentos do trait
- JSON com serde_json - Formato de comunicação padrão
- Personalizando a Serialização - Atributos
- Melhores Práticas do Serde - Estabilidade do esquema
- Configuração e Segredos - Configuração de produção
Versões da Stack: Esta página foi escrita para Rust 1.97.0 (edição 2024), Tokio 1.x, Axum 0.8, serde 1.0, sqlx 0.8, clap 4, e Polars 0.46+.