6.0 KiB
✅ Design do Formato de Serialização - CONCLUÍDO
Data: 22 de outubro de 2025
Status: ✅ Implementado e Testado
Resumo da Implementação
Foi realizada uma análise completa e implementação de dois formatos de serialização para comunicação entre processos no sistema de simulação de tráfego distribuído:
- JSON (Gson) - Recomendado
- Java Native Serialization - Fallback
Arquivos Criados
Documentação
- ✅
docs/SERIALIZATION_SPECIFICATION.md- Especificação completa (design, comparação, justificativa) - ✅
docs/SERIALIZATION_DECISION.md- Guia rápido de decisão - ✅
src/main/java/sd/serialization/README.md- Guia de uso do pacote
Código de Produção
- ✅
MessageSerializer.java- Interface comum para serialização - ✅
SerializationException.java- Exceção customizada - ✅
JsonMessageSerializer.java- Implementação JSON (Gson) - ✅
JavaMessageSerializer.java- Implementação Java nativa - ✅
SerializerFactory.java- Factory pattern para criação
Exemplos e Testes
- ✅
SerializationExample.java- Demonstração de uso - ✅
SerializationTest.java- Suite de testes unitários (14 testes, todos passando)
Configuração
- ✅
pom.xml- Dependência Gson adicionada
Decisão Final: JSON (Gson)
Justificativa
JSON foi escolhido como formato recomendado porque:
-
Debugging Superior 🐛
- Mensagens legíveis em texto
- Logs compreensíveis
- Inspeção visual fácil
-
Tamanho Otimizado 📦
- 54% menor que Java Serialization (300 vs 657 bytes)
- Menos banda de rede
- Menor latência de transmissão
-
Extensibilidade 🚀
- Dashboard web futuro
- APIs REST potenciais
- Integração universal
-
Segurança 🔒
- Sem vulnerabilidades de desserialização
- Validação mais simples
- Menos vetores de ataque
-
Performance Adequada ⚡
- Diferença: 7 μs (irrelevante)
- Volume esperado: ~100-1000 msgs/s (ambos suportam)
- Impacto no sistema: < 0.1%
Métricas de Performance
Testes Realizados (1000 iterações)
| Métrica | JSON (Gson) | Java Native | Diferença |
|---|---|---|---|
| Tamanho médio | 300 bytes | 657 bytes | -54% |
| Latência média | 40.79 μs | 33.34 μs | +7.45 μs |
| Throughput | ~24k msgs/s | ~30k msgs/s | Ambos > requisito |
| Legibilidade | ✅ Texto | ❌ Binário | - |
Conclusão: Diferença de performance é desprezível; vantagens do JSON compensam.
Exemplos de Mensagens
Vehicle Transfer (JSON)
{
"messageId": "a3c5e7f9-1234-5678-90ab-cdef12345678",
"type": "VEHICLE_TRANSFER",
"senderId": "Cr1",
"destinationId": "Cr2",
"timestamp": 1729595234567,
"payload": {
"id": "V123",
"type": "LIGHT",
"entryTime": 15.7,
"route": ["Cr1", "Cr2", "Cr5", "S"],
"currentRouteIndex": 1,
"totalWaitingTime": 3.2,
"totalCrossingTime": 1.8
}
}
Como Usar
Básico
// Criar serializer (JSON recomendado)
MessageSerializer serializer = SerializerFactory.createDefault();
// Serializar
byte[] data = serializer.serialize(message);
// Desserializar
Message msg = serializer.deserialize(data, Message.class);
Configuração via Sistema
# Escolher tipo
java -Dsd.serialization.type=JSON -jar app.jar
# Debug mode (pretty print)
java -Dsd.serialization.json.prettyPrint=true -jar app.jar
Validação
Testes Unitários
✅ 14/14 testes passando
Cobertura:
- ✅ Serialização/desserialização JSON
- ✅ Serialização/desserialização Java
- ✅ Validação de erros
- ✅ Tratamento de exceções
- ✅ Comparação de tamanhos
- ✅ Integridade de dados
- ✅ Factory pattern
- ✅ Round-trip completo
Exemplo Executado
JSON size: 300 bytes
Java size: 657 bytes
Difference: 357 bytes (54.3% menor)
Performance:
JSON: 40.79 μs/operation
Java: 33.34 μs/operation
✅ Todos os testes bem-sucedidos
Próximos Passos
Integração no Sistema
-
Comunicação entre Cruzamentos
// No sender (Cr1) MessageSerializer serializer = SerializerFactory.createDefault(); byte[] data = serializer.serialize(message); outputStream.write(data); // No receiver (Cr2) byte[] received = inputStream.readAllBytes(); Message msg = serializer.deserialize(received, Message.class); -
Dashboard Updates
// Serializar estatísticas StatsUpdate stats = new StatsUpdate(...); byte[] data = serializer.serialize(stats); sendToDashboard(data); -
Logging e Debugging
// Logar mensagens (JSON é legível) if (debugMode) { String json = new String(data, StandardCharsets.UTF_8); logger.debug("Sent message: " + json); }
Benefícios para o Projeto
-
Desenvolvimento 💻
- Debugging rápido e fácil
- Logs legíveis
- Menos tempo depurando problemas de serialização
-
Manutenção 🔧
- Código mais simples
- Evolução de protocolo facilitada
- Menos problemas de compatibilidade
-
Extensibilidade 📈
- Dashboard web nativo
- APIs REST futuras
- Integração com ferramentas
-
Aprendizado 📚
- Padrão da indústria
- Experiência com JSON
- Boas práticas de design
Referências
Conclusão
✅ Formato de serialização definido e implementado
✅ JSON (Gson) escolhido como padrão
✅ Implementação completa e testada
✅ Documentação abrangente criada
✅ Pronto para integração no sistema distribuído
Próxima etapa recomendada: Implementar camada de comunicação (sockets) usando os serializers criados.