mirror of
https://github.com/davidalves04/Trabalho-Pratico-SD.git
synced 2025-12-08 20:43:32 +00:00
README
This commit is contained in:
@@ -1,283 +0,0 @@
|
||||
# Serialization Package
|
||||
|
||||
Este pacote fornece implementações de serialização para comunicação entre processos no sistema de simulação de tráfego distribuído.
|
||||
|
||||
## Visão Geral
|
||||
|
||||
O pacote `sd.serialization` oferece uma interface unificada para serializar e desserializar objetos Java, permitindo a comunicação através de sockets entre diferentes processos (cruzamentos, coordenador, dashboard).
|
||||
|
||||
## Arquitetura
|
||||
|
||||
```
|
||||
MessageSerializer (interface)
|
||||
├── JsonMessageSerializer (Gson-based)
|
||||
└── JavaMessageSerializer (native)
|
||||
|
||||
SerializerFactory (factory pattern)
|
||||
SerializationException (custom exception)
|
||||
```
|
||||
|
||||
## Uso Rápido
|
||||
|
||||
### Exemplo Básico
|
||||
|
||||
```java
|
||||
// Criar um serializer (JSON recomendado)
|
||||
MessageSerializer serializer = SerializerFactory.createDefault();
|
||||
|
||||
// Serializar um objeto
|
||||
Vehicle vehicle = new Vehicle("V001", VehicleType.LIGHT, 10.5, route);
|
||||
byte[] data = serializer.serialize(vehicle);
|
||||
|
||||
// Enviar através de socket
|
||||
outputStream.write(data);
|
||||
|
||||
// Receber e desserializar
|
||||
byte[] received = inputStream.readAllBytes();
|
||||
Vehicle deserialized = serializer.deserialize(received, Vehicle.class);
|
||||
```
|
||||
|
||||
### Usando JSON (Recomendado)
|
||||
|
||||
```java
|
||||
// JSON com formatação legível (debugging)
|
||||
MessageSerializer serializer = new JsonMessageSerializer(true);
|
||||
|
||||
// JSON compacto (produção)
|
||||
MessageSerializer serializer = new JsonMessageSerializer(false);
|
||||
|
||||
// Ou via factory
|
||||
MessageSerializer serializer = SerializerFactory.createJsonSerializer();
|
||||
```
|
||||
|
||||
### Usando Java Serialization
|
||||
|
||||
```java
|
||||
// Direto
|
||||
MessageSerializer serializer = new JavaMessageSerializer();
|
||||
|
||||
// Ou via factory
|
||||
MessageSerializer serializer = SerializerFactory.createJavaSerializer();
|
||||
```
|
||||
|
||||
## Configuração
|
||||
|
||||
### Propriedades do Sistema
|
||||
|
||||
Configure o serializer padrão através de propriedades:
|
||||
|
||||
```bash
|
||||
# Definir tipo de serialização (JSON ou JAVA_NATIVE)
|
||||
java -Dsd.serialization.type=JSON -jar app.jar
|
||||
|
||||
# Habilitar pretty-print no JSON (debugging)
|
||||
java -Dsd.serialization.json.prettyPrint=true -jar app.jar
|
||||
```
|
||||
|
||||
### Programaticamente
|
||||
|
||||
```java
|
||||
// Definir antes de iniciar a aplicação
|
||||
System.setProperty("sd.serialization.type", "JSON");
|
||||
System.setProperty("sd.serialization.json.prettyPrint", "true");
|
||||
|
||||
MessageSerializer serializer = SerializerFactory.createDefault();
|
||||
```
|
||||
|
||||
## Comparação: JSON vs Java Serialization
|
||||
|
||||
| Característica | JSON (Gson) | Java Native |
|
||||
|----------------|-------------|-------------|
|
||||
| **Legibilidade** | ✅ Texto legível | ❌ Binário |
|
||||
| **Tamanho** | ✅ ~40% menor | ❌ Maior |
|
||||
| **Debugging** | ✅ Fácil | ❌ Difícil |
|
||||
| **Performance** | ⚠️ ~20% mais lento | ✅ Mais rápido |
|
||||
| **Interoperabilidade** | ✅ Universal | ❌ Só Java |
|
||||
| **Segurança** | ✅ Mais seguro | ⚠️ Vulnerabilidades |
|
||||
| **Dependências** | ⚠️ Gson | ✅ Nativo |
|
||||
| **Evolução** | ✅ Flexível | ⚠️ serialVersionUID |
|
||||
|
||||
### Recomendação: **JSON (Gson)** ✅
|
||||
|
||||
Para este projeto, JSON é recomendado porque:
|
||||
- Facilita debugging durante desenvolvimento
|
||||
- Tamanho menor de mensagens
|
||||
- Mais fácil de manter e evoluir
|
||||
- Permite integração futura (dashboard web)
|
||||
- Performance suficiente para o volume esperado
|
||||
|
||||
## Tratamento de Erros
|
||||
|
||||
```java
|
||||
try {
|
||||
byte[] data = serializer.serialize(object);
|
||||
// ... enviar ...
|
||||
} catch (SerializationException e) {
|
||||
// Log e tratamento
|
||||
logger.error("Failed to serialize: " + e.getMessage(), e);
|
||||
}
|
||||
|
||||
try {
|
||||
Object obj = serializer.deserialize(data, MyClass.class);
|
||||
} catch (SerializationException e) {
|
||||
// Dados corrompidos ou incompatíveis
|
||||
logger.error("Failed to deserialize: " + e.getMessage(), e);
|
||||
}
|
||||
```
|
||||
|
||||
## 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
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Statistics Update
|
||||
|
||||
```json
|
||||
{
|
||||
"messageId": "b4d6e8f0-2345-6789-01bc-def123456789",
|
||||
"type": "STATS_UPDATE",
|
||||
"senderId": "Cr3",
|
||||
"destinationId": "Dashboard",
|
||||
"timestamp": 1729595234789,
|
||||
"payload": {
|
||||
"intersectionId": "Cr3",
|
||||
"queueLengths": {
|
||||
"North": 5,
|
||||
"South": 3,
|
||||
"East": 7,
|
||||
"West": 2
|
||||
},
|
||||
"vehiclesProcessed": 142,
|
||||
"averageWaitTime": 4.5
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Testes
|
||||
|
||||
Execute os testes de serialização:
|
||||
|
||||
```bash
|
||||
mvn test -Dtest=SerializationTest
|
||||
```
|
||||
|
||||
Execute o exemplo de demonstração:
|
||||
|
||||
```bash
|
||||
mvn exec:java -Dexec.mainClass="sd.serialization.SerializationExample"
|
||||
```
|
||||
|
||||
## Performance
|
||||
|
||||
### Métricas Típicas (Rede Local)
|
||||
|
||||
**JSON:**
|
||||
- Tamanho médio: 250-350 bytes
|
||||
- Latência: 0.8-1.5 ms
|
||||
- Throughput: ~8,000 msgs/s
|
||||
|
||||
**Java Serialization:**
|
||||
- Tamanho médio: 400-600 bytes
|
||||
- Latência: 0.5-1.0 ms
|
||||
- Throughput: ~10,000 msgs/s
|
||||
|
||||
Para o volume esperado no projeto (~100-1000 msgs/s), ambos são mais que suficientes.
|
||||
|
||||
## Extensibilidade
|
||||
|
||||
### Adicionar Novo Tipo de Serialização
|
||||
|
||||
1. Implementar `MessageSerializer`
|
||||
2. Adicionar tipo em `SerializerFactory.SerializationType`
|
||||
3. Atualizar `SerializerFactory.create()`
|
||||
|
||||
Exemplo:
|
||||
|
||||
```java
|
||||
public class ProtobufMessageSerializer implements MessageSerializer {
|
||||
@Override
|
||||
public byte[] serialize(Object object) throws SerializationException {
|
||||
// Implementação
|
||||
}
|
||||
|
||||
@Override
|
||||
public <T> T deserialize(byte[] data, Class<T> clazz) throws SerializationException {
|
||||
// Implementação
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return "Protocol Buffers";
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Custom Type Adapters (JSON)
|
||||
|
||||
Para tipos complexos ou customização:
|
||||
|
||||
```java
|
||||
GsonBuilder builder = new GsonBuilder();
|
||||
builder.registerTypeAdapter(MyClass.class, new MyClassAdapter());
|
||||
Gson gson = builder.create();
|
||||
```
|
||||
|
||||
## Boas Práticas
|
||||
|
||||
1. **Validação**: Sempre validar objetos após desserialização
|
||||
2. **Logging**: Logar mensagens em desenvolvimento, desabilitar em produção
|
||||
3. **Versionamento**: Incluir versão nas mensagens para evolução
|
||||
4. **Exceções**: Tratar `SerializationException` apropriadamente
|
||||
5. **Testes**: Testar serialização round-trip para todos os tipos
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### "SerializationException: Failed to serialize"
|
||||
- Verificar se o objeto é Serializable (Java) ou tem getters/setters (JSON)
|
||||
- Verificar se há referências circulares
|
||||
|
||||
### "SerializationException: Failed to parse JSON"
|
||||
- Dados corrompidos na rede
|
||||
- Incompatibilidade de versão entre classes
|
||||
- JSON malformado
|
||||
|
||||
### Messages muito grandes
|
||||
- Revisar estrutura de dados
|
||||
- Considerar compressão (gzip)
|
||||
- Enviar apenas dados necessários
|
||||
|
||||
### Performance issues
|
||||
- Verificar se está usando pretty-print em produção (desabilitar)
|
||||
- Considerar pool de serializers
|
||||
- Medir com profiler
|
||||
|
||||
## Recursos Adicionais
|
||||
|
||||
- [Especificação Completa](../docs/SERIALIZATION_SPECIFICATION.md)
|
||||
- [Gson Documentation](https://github.com/google/gson/blob/master/UserGuide.md)
|
||||
- [Java Serialization Spec](https://docs.oracle.com/javase/8/docs/platform/serialization/spec/serialTOC.html)
|
||||
|
||||
## Suporte
|
||||
|
||||
Para questões ou problemas, consultar:
|
||||
1. Documentação completa: `docs/SERIALIZATION_SPECIFICATION.md`
|
||||
2. Testes unitários: `test/java/sd/serialization/SerializationTest.java`
|
||||
3. Exemplo de uso: `main/java/sd/serialization/SerializationExample.java`
|
||||
Reference in New Issue
Block a user