Dominando Java ObjectOutputStream: Serialização, Métodos e Exemplos Práticos
Classe Java ObjectOutputStream
Explore a API Java ObjectOutputStream, seus métodos principais e exemplos passo a passo que demonstram como serializar objetos em arquivos e lê-los de volta.
A classe ObjectOutputStream do pacote java.io permite escrever objetos Java para que possam ser lidos posteriormente por ObjectInputStream. Ela estende OutputStream e é a espinha dorsal do mecanismo de serialização embutido do Java.
Como ObjectOutputStream Funciona
Quando você escreve um objeto em um ObjectOutputStream, o framework codifica o nome da classe do objeto, valores de campos e informações de tipo em um formato binário — um processo conhecido como serialização. O stream de bytes resultante pode ser armazenado em um arquivo, transmitido pela rede ou até mesmo incorporado na memória.
Importante: Apenas objetos que implementam java.io.Serializable podem ser serializados. Esta interface atua como um marcador para informar ao runtime que um objeto é seguro para ser persistido ou transmitido.
Criando um ObjectOutputStream
Comece importando a classe:
import java.io.ObjectOutputStream;
Então, vincule-a a um FileOutputStream ou qualquer outro OutputStream subjacente:
// Escreve em um arquivo chamado "dados.bin"
FileOutputStream fileStream = new FileOutputStream("dados.bin");
ObjectOutputStream objStream = new ObjectOutputStream(fileStream);
Aqui, objStream está pronto para serializar objetos em fileStream.
Métodos Principais do ObjectOutputStream
A classe herda um conjunto de métodos de OutputStream e adiciona outros especializados para manipulação de objetos:
write(int b)– escreve um único byte.writeBoolean(boolean v)– escreve um valor booleano.writeChar(int v)– escreve um caractere.writeInt(int v)– escreve um inteiro.writeObject(Object obj)– serializa o objeto dado.
Exemplo 1: Serializando Dados Primitivos e String
Abaixo está um snippet completo que escreve um int e uma String em um arquivo, depois os lê de volta usando ObjectInputStream:
import java.io.*;
public class Main {
public static void main(String[] args) {
int dado1 = 5;
String dado2 = "Isto é programiz";
try {
// Escreve objetos
FileOutputStream fos = new FileOutputStream("arquivo.bin");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeInt(dado1);
oos.writeObject(dado2);
oos.close();
// Lê objetos
FileInputStream fis = new FileInputStream("arquivo.bin");
ObjectInputStream ois = new ObjectInputStream(fis);
System.out.println("Dado inteiro :" + ois.readInt());
System.out.println("Dado string :" + ois.readObject());
ois.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
Saída
Dado inteiro :5 Dado string :Isto é programiz
Exemplo 2: Serializando um Objeto Personalizado
Para serializar uma classe definida pelo usuário, simplesmente implemente Serializable:
import java.io.*;
class Dog implements Serializable {
String nome;
String raca;
Dog(String nome, String raca) {
this.nome = nome;
this.raca = raca;
}
}
public class Main {
public static void main(String[] args) {
Dog dog1 = new Dog("Tyson", "Labrador");
try {
// Escreve o objeto
FileOutputStream fos = new FileOutputStream("dog.bin");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(dog1);
oos.close();
// Lê o objeto
FileInputStream fis = new FileInputStream("dog.bin");
ObjectInputStream ois = new ObjectInputStream(fis);
Dog novoDog = (Dog) ois.readObject();
System.out.println("Nome do Cachorro: " + novoDog.nome);
System.out.println("Raça do Cachorro: " + novoDog.raca);
ois.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
Saída
Nome do Cachorro: Tyson Raça do Cachorro: Labrador
A classe Dog deve implementar Serializable porque ObjectOutputStream só pode escrever objetos serializáveis.
Operações Adicionais do ObjectOutputStream
| Método | Descrição |
|---|---|
flush() |
Força quaisquer bytes de saída em buffer para o stream subjacente. |
drain() |
Libera dados em buffer (disponível no Java 9+). |
close() |
Fecha o stream e libera quaisquer recursos do sistema. |
Para um mergulho mais profundo, consulte a documentação oficial do Java.
Java
- Entendendo a Palavra-chave final em Java: Variáveis, Métodos e Classes
- Operador instanceof em Java: Guia Completo
- Dominando Herança em Java: Conceitos, Tipos e Exemplos Práticos
- Entendendo Classes Aninhadas Estáticas em Java: Uso, Diferenças e Exemplos
- Dominando Classes Internas Anônimas em Java: Definição, Sintaxe e Exemplos Práticos
- Padrão Singleton em Java Explicado: Como Implementar e Usar com Segurança
- Dominando Reflection em Java: Inspecionando Classes, Métodos e Campos em Tempo de Execução
- Dominando ArrayList em Java: Operações, Métodos e Boas Práticas
- Dominando Java Generics – Construindo Código Reutilizável e Type-Safe
- Dominando Operações de Arquivo em Java com java.io – Criação, Leitura, Escrita e Exclusão