Serialização de objetos em Java: o que é e para que serve?
Serialização em Java é o processo de converter o estado de um objeto em um fluxo de bytes para salvar em arquivo, banco de dados ou transmitir pela rede. O processo inverso — restaurar o objeto a partir do fluxo de bytes — é chamado de desserialização. Esta tecnologia está na base de muitos frameworks Java: desde RMI (Remote Method Invocation) até sistemas de troca de mensagens.
Neste artigo, vamos analisar como funciona a serialização embutida do Java, com exemplos práticos, e discutir as melhores práticas para seu uso.
Como funciona a serialização em Java?
O Java fornece um mecanismo de serialização embutido através da interface java.io.Serializable. Esta interface não contém métodos — ela é uma interface marcadora (marker interface). Se uma classe implementa Serializable, a JVM automaticamente permite a serialização de seus objetos.
Para escrever e ler objetos, são usadas duas classes principais do pacote java.io:
ObjectOutputStream— serializa o objeto em um fluxo de bytesObjectInputStream— desserializa o objeto a partir do fluxo de bytes
Exemplo simples de serialização
Vamos criar uma classe Person que pode ser serializada:
import java.io.Serializable;
public class Person implements Serializable { private static final long serialVersionUID = 1L; private String name; private int age; private transient String password; // não será serializado
public Person(String name, int age, String password) { this.name = name; this.age = age; this.password = password; }
@Override public String toString() { return "Person{name='" + name + "', age=" + age + ", password='" + password + "'}"; }}Agora vamos escrever o código para serialização e desserialização:
import java.io.*;
public class SerializationDemo { public static void main(String[] args) { Person person = new Person("João", 30, "secret123"); // Serialização try (FileOutputStream fos = new FileOutputStream("person.ser"); ObjectOutputStream oos = new ObjectOutputStream(fos)) { oos.writeObject(person); System.out.println("Objeto serializado: " + person); } catch (IOException e) { e.printStackTrace(); }
// Desserialização try (FileInputStream fis = new FileInputStream("person.ser"); ObjectInputStream ois = new ObjectInputStream(fis)) { Person restoredPerson = (Person) ois.readObject(); System.out.println("Objeto restaurado: " + restoredPerson); } catch (IOException | ClassNotFoundException e) { e.printStackTrace(); } }}Saída do programa:
Objeto serializado: Person{name='João', age=30, password='secret123'}Objeto restaurado: Person{name='João', age=30, password='null'}Observe: o campo password foi marcado com a palavra-chave transient e, na desserialização, recebeu o valor null. Esta é a forma padrão de excluir dados confidenciais da serialização.
Características importantes da serialização em Java
- serialVersionUID — identificador único da versão da classe. Se não for declarado explicitamente, a JVM o gerará automaticamente, mas isso pode causar o erro
InvalidClassExceptionao modificar a classe. Recomenda-se sempre declararprivate static final long serialVersionUID. - Campos estáticos não são serializados — eles pertencem à classe, não ao objeto.
- Objetos aninhados — se o objeto serializável contém referências a outros ob
Também na biblioteca
Cliente Redis para Java: Jedis, Lettuce e Redisson — visão geral e exemplos
Autorização e Autenticação em Kotlin: Ktor, JWT e Spring Security
Wire para Go: guia completo com exemplos
MongoDB.Driver para C# (.NET): guia completo com exemplos