No description
- Rust 100%
| .woodpecker | ||
| src | ||
| tests | ||
| .gitignore | ||
| Cargo.lock | ||
| Cargo.toml | ||
| LICENSE | ||
| README.md | ||
Lição 53: Serialização (JSON, Serde, Persistência)
1. Narrativa
Os mechas da Academia Æther geram enormes volumes de dados de missão — logs de combate, estatísticas de energia, registros de pilotos. Tudo precisa ser armazenado e transmitido. Serialização é a arte de converter estruturas de dados complexas em formato transmissível e armazenável, e desserialização é a arte de reconstruí-las. O piloto que domina serialização nunca perde o histórico de suas missões.
2. Conceito
Serialização é o processo de transformar dados em memória para um formato que pode ser armazenado ou transmitido:
- Formato texto: JSON, CSV, URL-encoded — legível por humanos
- Formato binário: Bincode, MessagePack — eficiente em tamanho
- Serde: Ecossistema Rust para serialização/desserialização automática
- Validação: Verificar integridade dos dados antes de confiar neles
3. Requisitos
- Implementar serialização manual de structs para strings
- Implementar desserialização manual de strings para structs
- Validar dados antes da desserialização
- Trabalhar com lotes de dados (multi-linha)
- Converter para formatos de transmissão (URL params)
4. Design de Dados
graph LR
A[RegistroMecha] -->|serializar_mecha| B["String: id|nome|..."]
B -->|desserializar_mecha| A
A -->|para_parametros_url| C[String: id=1&nome=...]
A -->|validar_registro| D[Ok / Err]
A -->|serializar_lote| E[Multi-line String]
E -->|desserializar_lote| A
5. Diagrama de Fluxo
flowchart TD
A[Texto Recebido] --> B[Desserializar]
B --> C{Parse OK?}
C -->|Não| D[ErroDesserializacao]
C -->|Sim| E[RegistroMecha]
E --> F[Validar]
F --> G{Válido?}
G -->|Não| H[ErroDesserializacao]
G -->|Sim| I[Armazenar / Processar]
6. Funções
| Função | Descrição |
|---|---|
serializar_mecha |
Serializa registro para formato pipe-delimited |
desserializar_mecha |
Desserializa linha para registro |
serializar_lote |
Serializa lista para texto multi-linha |
desserializar_lote |
Desserializa texto para lista de registros |
validar_registro |
Valida consistência dos dados |
filtrar_por_status |
Filtra registros por status |
calcular_estatisticas_lote |
Calcula estatísticas agregadas |
para_parametros_url |
Converte para formato URL-encoded |
7. Exemplo
let registro = RegistroMecha {
id: 1, nome: "Æther-01".into(), piloto: "Rex".into(),
status: StatusMecha::Ativo, energia: 100, missoes: 42,
};
let texto = serializar_mecha(®istro);
assert_eq!(texto, "1|Æther-01|Rex|ativo|100|42");
let restaurado = desserializar_mecha(&texto).unwrap();
assert_eq!(restaurado, registro);
Serialização JSON com Serde
Os tipos RegistroMecha e StatusMecha derivam Serialize e Deserialize,
permitindo conversão automática para JSON e de volta:
use serde_json::json;
let registro = RegistroMecha {
id: 1, nome: "Æther-01".into(), piloto: "Rex".into(),
status: StatusMecha::Ativo, energia: 100, missoes: 42,
};
// Serializar para JSON
let json = serde_json::to_string(®istro).unwrap();
assert!(json.contains("\"nome\":\"Æther-01\""));
// Desserializar de JSON
let restaurado: RegistroMecha = serde_json::from_str(&json).unwrap();
assert_eq!(restaurado, registro);
// Construir a partir de um valor JSON
let valor = json!({ "id": 2, "nome": "Titan-07", "piloto": "Max",
"status": "EmCombate", "energia": 80, "missoes": 15 });
let outro: RegistroMecha = serde_json::from_value(valor).unwrap();
8. Missão
- Implementar
serializar_mechaconvertendo struct para string pipe-delimited - Implementar
desserializar_mechafazendo split por|e parse dos campos - Implementar
serializar_lotejuntando linhas com\n - Implementar
desserializar_lotefazendo split por\ne desserializando cada linha - Implementar
validar_registroverificando restrições de cada campo - Implementar
filtrar_por_statususando iterators - Implementar
calcular_estatisticas_loteagregando dados com fold - Implementar
para_parametros_urlmontando query string
9. Como Executar
cargo build
cargo test
cargo clippy -- -D warnings
cargo fmt --check
10. Dicas
- Use
.split('|')para separar campos na desserialização - Use
.parse::<u32>()para converter strings em números - Trate erros com
map_err()para converter falhas de parse emErroDesserializacao - Linhas vazias no lote devem ser ignoradas com
.filter(|l| !l.is_empty()) - URL encoding usa
&como separador e=entre chave e valor