Files
SD/main/docs/SERIALIZATION_SUMMARY.md
2025-10-23 20:08:26 +01:00

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:

  1. JSON (Gson) - Recomendado
  2. 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:

  1. Debugging Superior 🐛

    • Mensagens legíveis em texto
    • Logs compreensíveis
    • Inspeção visual fácil
  2. Tamanho Otimizado 📦

    • 54% menor que Java Serialization (300 vs 657 bytes)
    • Menos banda de rede
    • Menor latência de transmissão
  3. Extensibilidade 🚀

    • Dashboard web futuro
    • APIs REST potenciais
    • Integração universal
  4. Segurança 🔒

    • Sem vulnerabilidades de desserialização
    • Validação mais simples
    • Menos vetores de ataque
  5. 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

  1. 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);
    
  2. Dashboard Updates

    // Serializar estatísticas
    StatsUpdate stats = new StatsUpdate(...);
    byte[] data = serializer.serialize(stats);
    sendToDashboard(data);
    
  3. 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

  1. Desenvolvimento 💻

    • Debugging rápido e fácil
    • Logs legíveis
    • Menos tempo depurando problemas de serialização
  2. Manutenção 🔧

    • Código mais simples
    • Evolução de protocolo facilitada
    • Menos problemas de compatibilidade
  3. Extensibilidade 📈

    • Dashboard web nativo
    • APIs REST futuras
    • Integração com ferramentas
  4. 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.