Programação, diversão e arte. Por Ricardo Giaviti
Posts tagged objetos
Serialização de objeto no Java
Dec 3rd
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





Recent Comments