Como serializar e desserializar objetos em Java?

A serialização em Java permite salvar objetos em arquivos e a desserialização os recupera, utilizando a interface Serializable e fluxos de entrada e saída.

Como serializar e desserializar objetos em Java?

A serialização é o processo de transformar um objeto Java em uma sequência de bytes para armazenamento ou transmissão. A desserialização é o processo inverso: reconstruir um objeto a partir desses bytes.

Em Java, utilizamos a interface Serializable para indicar que uma classe pode ser serializada. A gravação e recuperação do objeto são feitas com ObjectOutputStream e ObjectInputStream.

1. Criando uma Classe Serializável

Para serializar um objeto, a classe deve implementar Serializable.

import java.io.*;

public class Usuario implements Serializable {
    private static final long serialVersionUID = 1L;
    private String nome;
    private int idade;

    public Usuario(String nome, int idade) {
        this.nome = nome;
        this.idade = idade;
    }

    public String getNome() { return nome; }
    public int getIdade() { return idade; }
}

2. Serializando um Objeto

Para salvar um objeto em um arquivo, usamos ObjectOutputStream.

import java.io.*;

public class SerializarObjeto {
    public static void main(String[] args) {
        try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("usuario.ser"))) {
            Usuario usuario = new Usuario("João", 30);
            oos.writeObject(usuario);
            System.out.println("Objeto serializado com sucesso!");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

3. Desserializando um Objeto

Para recuperar o objeto, usamos ObjectInputStream.

import java.io.*;

public class DesserializarObjeto {
    public static void main(String[] args) {
        try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("usuario.ser"))) {
            Usuario usuario = (Usuario) ois.readObject();
            System.out.println("Nome: " + usuario.getNome());
            System.out.println("Idade: " + usuario.getIdade());
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

Saída esperada:

Nome: João
Idade: 30

4. Ignorando Atributos na Serialização

Podemos usar transient para impedir que certos atributos sejam serializados.

private transient String senha;

5. Comparação Entre Métodos

Método Função
writeObject() Serializa e grava um objeto em um arquivo
readObject() Recupera um objeto serializado
transient Evita que um atributo seja serializado

Conclusão

A serialização é útil para salvar o estado de objetos em arquivos ou enviá-los pela rede. O uso de transient permite omitir dados sensíveis. Em aplicações modernas, pode ser substituída por formatos como JSON e XML.

A serialização é amplamente utilizada em sistemas distribuídos, como aplicações que precisam armazenar sessões de usuários ou transmitir objetos entre servidores. Frameworks como Hibernate e Spring usam serialização para armazenar e recuperar estados de objetos em bancos de dados ou cache.

Algumas aplicações:

  • Armazenamento de objetos em arquivos
  • Transmissão de objetos entre servidores
  • Persistência de sessões de usuários
  • Armazenamento de cache em aplicações

Dicas para quem está começando

  • Implemente Serializable para permitir a serialização
  • Use transient para proteger informações sensíveis
  • Evite modificar a estrutura da classe após serialização
  • Verifique a compatibilidade da serialVersionUID
  • Considere JSON para alternativas mais portáveis

Contribuições de Rodrigo Farias

Compartilhe este tutorial: Como serializar e desserializar objetos em Java

Compartilhe este tutorial

Continue aprendendo:

Como ler e escrever arquivos binários em Java

A leitura e escrita de arquivos binários em Java pode ser feita com FileInputStream, FileOutputStream e DataOutputStream para manipulação eficiente de dados.

Tutorial anterior

Qual a diferença entre FileReader e BufferedReader

FileReader e BufferedReader são usados para leitura de arquivos em Java, mas BufferedReader é mais eficiente por usar buffer para otimizar a performance.

Próximo tutorial