DEV Community

Java Efetivo (livro)
Java Efetivo (livro)

Posted on • Edited on

Item 86: Tenha cautela ao implementar a Serializable

Atenção: Com as evoluções do Java e práticas modernas, existem alternativas mais seguras e eficientes para lidar com serialização/desserialização. Mas como estamos estudando o livro vamos considerar para aprender. VER NO TÓPICO FINAL SOBRE SERIALIZAÇÃO

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)

Sentry image

See why 4M developers consider Sentry, “not bad.”

Fixing code doesn’t have to be the worst part of your day. Learn how Sentry can help.

Learn more