Serialização de objetos em Java: guia completo para iniciantes

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

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 bytes
  • ObjectInputStream — 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 InvalidClassException ao modificar a classe. Recomenda-se sempre declarar private 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

Recommendations