DEV Community

Java Efetivo (livro)
Java Efetivo (livro)

Posted on

Item 86: Tenha cautela ao implementar a Serializable

1. Implementação Simples, Consequências Complexas

  • Basta adicionar implements Serializable para tornar uma classe serializável.
  • Serializar uma classe pode ter custos significativos a longo prazo.

2. Impacto na Evolução da Classe
Uma vez serializável, sua forma serializada se torna parte da API pública.
Alterações internas podem quebrar a compatibilidade com versões anteriores.
É possível manter compatibilidade manualmente (ObjectOutputStream.putFields e ObjectInputStream.readFields), mas é complexo.

3. Problemas com serialVersionUID

  • Cada classe serializável tem um identificador único (serialVersionUID).
  • Se não for especificado manualmente, o compilador o gera automaticamente.
  • Qualquer alteração na classe pode mudar esse ID, quebrando a compatibilidade e gerando InvalidClassException.

4. Riscos de Segurança

  • Serialização ignora construtores e pode burlar restrições da linguagem.
  • Objetos podem ser criados com valores inválidos ou permitir acesso não autorizado.
  • Dependência da desserialização padrão pode resultar em vulnerabilidades (ver Item 88).

5. Aumento na Complexidade de Testes

  • Classes serializáveis precisam ser testadas entre diferentes versões.
  • Quanto mais classes serializáveis, maior a matriz de testes necessária.
  • Formas serializadas mal planejadas dificultam a evolução do código.

6. Quando Serializar é Necessário
Essencial para frameworks que exigem serialização.
Útil em classes de valor (BigInteger, Instant) e coleções.
Classes que representam processos ativos (ThreadPool) geralmente não devem ser serializáveis

7. Serialização e Herança

  • Classes projetadas para herança geralmente não devem ser serializáveis.
  • Interfaces raramente devem estender Serializable, pois impõem um fardo extra a implementações futuras.
  • Exceções notáveis: Throwable (para propagação de exceções via RMI) e Component (para GUIs no Swing/AWT).

8. Problemas com Classes Internas

  • Classes internas não devem ser serializáveis devido a campos sintéticos não especificados.
  • Classes membros estáticas podem implementar Serializable.

9. Alternativas à Serialização

  • Usar o padrão proxy de serialização (Item 90) para maior controle.
  • Utilizar formatos como JSON ou XML para persistência e transmissão.

Top comments (0)