Quando estamos fazendo qualquer atividade no computador como um documento de texto, jogando um game ou até mesmo declarando o imposto de renda é quase que imperceptivel para nós a capacidade desses aplicativos salvarem informações no computador para que no futuro possamos continuar o trabalho de onde paramos. Mas o que isso tem haver com serialização de objetos no Java?

Bem, quando estamos codificando em Java, nossa aplicação também poderá salvar e recuperar informações no computador. Essas informações salvas, são salvas como objetos e essas mesmas informações salvas podem ser recuperadas para uso posterior pelo nosso programa.

Basicamente a serialização de objetos nos permite salvar em arquivo objetos para que no futuro nossa aplicação recupere esse objeto a partir do arquivo ou até mesmo uma outra aplicação poderá recuperar tal objeto. Diversas linguagens trabalham com serialização de objetos. Em um post futuro, tentarei explicar como funciona a serialização de objetos no Ruby.

A serialização de objetos no Java é simples e utiliza uma interface de marcação que é a java.io.Serializable. Essa interface não possui nenhum método. Ela só serve para marcar a classe que poderá ser serializada. Quando Java internamente olhar para essa classe e ver que ela implementa a java.io.Serializable, ele saberá que essa classe é certa para a serialização.

A serialização é boa para alguns casos e ruins para outros. Em classes onde há senhas, dados confidenciais ou qualquer tipo de informação que deva ser protegida a serialização pode ser perigosa pois ela “externa” essas informações. Portanto deverá haver muito cuidado na hora de se decidir o que deve ser serializado ou não.

Nesse post mostrarei de forma bem simples e organizada como serializar o objeto para arquivo, recuperar esse objeto e exibir em console os atributos do objeto que salvamos.

Primeiramente vamos criar um objeto que iremos salvar. Eu criei uma JavaBean que representa um carro.

package com.meupost.beans;
 
import java.io.Serializable;
 
public class Carro implements Serializable {
 
	private String cor;
	private String nome;
	private String marca;
	private float valor;
 
	public String getCor() {
		return cor;
	}
 
	public void setCor(String cor) {
		this.cor = cor;
	}
 
	public String getNome() {
		return nome;
	}
 
	public void setNome(String nome) {
		this.nome = nome;
	}
 
	public String getMarca() {
		return marca;
	}
 
	public void setMarca(String marca) {
		this.marca = marca;
	}
 
	public float getValor() {
		return valor;
	}
 
	public void setValor(float valor) {
		this.valor = valor;
	}
}

Feita a nossa classe que irá ser serializada, iremos criar outra classe que será responsável por serializar o objeto da classe acima. Essa classe que iremos criar agora é a classe fundamental na serialização de objetos no Java. Vejam:

package com.meupost.serial;
 
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
 
public class Serializar {
 
	/**
	* Esse método recebe um objeto arquivo e o objeto que será serializado. 
        * O método irá serializar o objeto passado no arquivo (referenciado pelo objeto file).
	*/
	public static void salvarObjeto(File file, Object objeto) throws FileNotFoundException,
 IOException {
 
		if (objeto == null) {
			throw new NullPointerException("Objeto passado é nulo");
		}
 
		FileOutputStream fileOut = null;
		ObjectOutputStream objOut = null;
 
		try {
			fileOut = new FileOutputStream(file);
			objOut = new ObjectOutputStream(fileOut);
			objOut.writeObject(objeto);
 
		} 
		catch (FileNotFoundException e) {
			throw new FileNotFoundException("O arquivo não pode ser encontrado");
		} 
		catch (IOException e) {
			throw new IOException("Erro de entrada e saída");
		}
		finally {
			if (fileOut != null) {
				fileOut.close();
			}
 
			if (objOut != null) {
				objOut.close();
			}
		}
 
	}
 
	/**
	* Para ler o objeto serializado, nós somente precisamos no arquivo onde 
        * esse objeto está salvado.
	* Sabendo o arquivo, nós conseguimos recuperar o objeto tranquilamente.
	*/
	public static Object recuperarObjeto(File file) throws FileNotFoundException, IOException,
ClassNotFoundException {
		Object obj = null;
 
		if (file == null) {
			throw new NullPointerException("Objeto FILE é Nulo.");
		}
 
		FileInputStream fileIn = null;
		ObjectInputStream objIn = null;
 
		try {
			fileIn = new FileInputStream(file);
			objIn = new ObjectInputStream(fileIn);
 
			obj = objIn.readObject();
		}
		catch (FileNotFoundException e) {
			throw new FileNotFoundException("Arquivo não encontrado");
		}
		catch (IOException e) {
			throw new IOException("Erro de entrada e saída");
		}
		catch (ClassNotFoundException e) {
			throw new ClassNotFoundException("Erro ao recuperar objeto do arquivo");
		}
		finally {
			if (fileIn != null) {
				fileIn.close();
			}
 
			if (objIn != null) {
				objIn.close();
			}
		}
 
		return obj;
	}
}

Com essa classe pronta, nós estamos apto a serializar o nosso objeto. Assim, vamos criar a classe Main para que nós possamos testar se nossa serialização irá funcionar o não. Na classe Main nós iremos instanciar alguns objetos Carro, colocaremos esses objetos em uma List e salvaremos essa List usando a nossa classe Serializar.

Depois de serializado, nós iremos recuperar essa List e iremos iremos percorrer essa lista mostrando os objetos que foram salvo. Eu criei um método que preenche a lista com objetos carro para ficar mais organizado.

package com.meupost.main;
 
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
 
import com.meupost.beans.Carro;
import com.meupost.serial.Serializar;
 
public class Main {
 
	/**
	* Na classe Main iremos testar nossa serialização. Vamos serializar uma lista
	* de objetos Carro.
	*/
	public static void main(String[] args) {
		String path = "C:\Documents and Settings\ricardo\Desktop\objeto.ser";
		File file = new File(path);
 
		try {
			List<Carro> lstCarros = preencherLista();
 
			Serializar.salvarObjeto(file, lstCarros);
			System.out.println("Objetos salvos com Sucesso!");
 
			List<Carro> novaLista =  (List) Serializar.recuperarObjeto(file);
			System.out.println("Objetos Recuperados com sucesso");
 
			Iterator<Carro> it = novaLista.iterator();
 
			while (it.hasNext()) {
				Carro car = (Carro) it.next();
				System.out.println("Nome: " + car.getNome());
				System.out.println("Marca: " + car.getMarca());
				System.out.println("Cor: " + car.getCor());
				System.out.println("Valor: " + car.getValor());
				System.out.println("==================================");
			}
 
		} 
		catch (FileNotFoundException e) {
			e.printStackTrace();
		} 
		catch (IOException e) {
			e.printStackTrace();
		}
		catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		catch (Exception ex) {
			ex.printStackTrace();
		}
	}
 
	/**
	* Cria e seta nosso objeto carro. Colocaremos esse objeto em uma lista. Tal lista,
	* contendo os objetos carro, irá ser serializada.
	*/
	public static List<Carro> preencherLista() {
		List<Carro> listaCarros = null;
 
		Carro carro1 = new Carro();
		carro1.setCor("Preto");
		carro1.setMarca("Ford");
		carro1.setNome("F-250");
		carro1.setValor(80000.50F);
 
		Carro carro2 = new Carro();
		carro2.setCor("Prata");
		carro2.setMarca("Chevrolet");
		carro2.setNome("Celta");
		carro2.setValor(26451.44F);
 
		Carro carro3 = new Carro();
		carro3.setCor("Vermelho");
		carro3.setMarca("Chevrolet");
		carro3.setNome("Corsa");
		carro3.setValor(38478.40F);
 
		Carro carro4 = new Carro();
		carro4.setCor("Amarelo");
		carro4.setMarca("Volkswagen");
		carro4.setNome("Fusca");
		carro4.setValor(2411.14F);
 
		listaCarros = new ArrayList<Carro>();
 
		listaCarros.add(carro1);
		listaCarros.add(carro2);
		listaCarros.add(carro3);
		listaCarros.add(carro4);
 
		return listaCarros;
	}
}

Feita a classe Main e verificado que não há nenhum erro de compilação, nós podemos executar nosso pequeno programa. Executando da forma que está postada aqui, a saída para console ficará assim:

Objetos salvos com Sucesso!
Objetos Recuperados com sucesso
Nome: F-250
Marca: Ford
Cor: Preto
Valor: 80000.5
=======================================
Nome: Celta
Marca: Chevrolet
Cor: Prata
Valor: 26451.44
=======================================
Nome: Corsa
Marca: Chevrolet
Cor: Vermelho
Valor: 38478.4
=======================================
Nome: Fusca
Marca: Volkswagen
Cor: Amarelo
Valor: 2411.14
=======================================

E isso pessoal, espero que tenha sido útil o tutorial e que tenham gostado. Se quiserem saber mais sobre serialização de objetos utilizando o Java, você pode achar nesses links:

  • http://en.wikipedia.org/wiki/Serialization#Java
  • http://java.sun.com/developer/technicalArticles/Programming/serialization/
  • http://www.deitel.com/articles/java_tutorials/20050923/IntroductionToObjectSerialization.html