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.
Por que a serialização de objetos é essencial para aplicações distribuídas?
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