Aula 20 – Serialização Disciplina: Programação Estruturada e Orientada a Objetos Prof. Bruno Gomes http://www.profbrunogomes.com.br/ Agenda da Aula Serialização de Objetos Serialização de Objetos Serialização de Objetos consiste em transformálo em bytes, permitindo ser armazenado em disco ou transmitido por um stream. Stream é um objeto responsável por uma transmissão de dados, de uma origem a um destino. Resumindo: Permite salvar e recuperar o estado de um objeto; Tipos de Armazenamento Arquivos de Textos; Arquivos Properties; Arquivos XML; Banco de dados. Entre inúmeros outros. Arquivo de Texto Para gravar informações em arquivos de texto, é necessário utilizar um tipo de Stream, nesta aula vamos utilizar: FileOutputStream: FileInputStream Responsável pela gravação em um arquivo. Responsável pela leitura de um arquivo. Ficam no pacote java.io: Classes que controlam entrada e saída de dados PERSISTÊNCIA DE DADOS Primeiro Passo Criar uma Classe Modelo e implementar de Serializable. Exemplo para Produto: import java.io.Serializable; public class Produto implements Serializable{ private String nome; private String codigoBarras; } Primeiro Passo Na Classe Produto criar: Um construtor parametrizado; Todos os métodos GETs e SETs; Método toString. Segundo Passo Criar um nova classe (Utilidade), que terá os métodos de armazenamento e leitura dos dados. Criar um método que receberá um objeto Produto e armazenará em um arquivo: public class Utilidade { public void armazenarProduto(Produto produto){ } } Segundo Passo Criar um objeto do tipo FileOutputStream, e indicar o local até o arquivo em que os dados serão salvos. import java.io.FileOutputStream; public class Utilidade { public void armazenarProduto(Produto produto){ FileOutputStream gravacao = new FileOutputStream("c:/Aula/teste.txt"); } } Terceiro Passo Adicionar o código entre um Try…Catch para tratamento de exceção (caso não encontre um arquivo, ou qualquer outro problema: import java.io.FileOutputStream; public class Utilidade { public void armazenarProduto(Produto produto){ try{ FileOutputStream gravacao = new FileOutputStream("c:/Aula/teste.txt"); }catch( Exception e ){ e.printStackTrace( ); } } } ObjectOutputStream Utilizar um objeto ObjectOutputStream para trabalhar diretamente com objetos na stream: try{ FileOutputStream gravacao = new FileOutputStream("c:/Aula/teste.txt"); ObjectOutputStream objGravar = new ObjectOutputStream(gravacao); objGravar.writeObject(produto); objGravar.flush(); objGravar.close(); gravacao.flush(); gravacao.close(); Importar }catch( Exception e ){ e.printStackTrace( ); } java.io.ObjectOutputStream; Quarto Passo Criar manualmente o arquivo vazio na pasta de destino (com o mesmo nome do indicado no objeto FileOutputStream) c:/Aula/teste.txt Obs.: o arquivo é criado automaticamente, mas alguns servidores e sistemas operacionais não dão permissão para esta operação, por isso a criação manual. Quinto Passo Criar uma classe de teste, criar um objeto Produto, e armazenar através da Classe Utilidade. public class TesteSerializacao { public static void main(String[] args) { Produto p1 = new Produto("Arroz", "123456"); Utilidade u1 = new Utilidade(); u1.armazenarProduto(p1); } } Executar e verificar se o arquivo foi preenchido com os dados de Produto. LEITURA DE ARQUIVO Lendo Arquivos Primeiro Passo Na classe Utilidade, acrescentar o método de leitura, e retornar um objeto Produto: public class Utilidade { public Produto lerProduto(){ } Segundo Passo Implementar FileInputStream caminho do arquivo de leitura; indicando o FileInputStream leitura = new FileInputStream("c:/Aula/teste.txt"); Terceiro Passo Utilizar Try..Catch e um objeto ObjectInputStream para a leitura e conversão em objeto: public Produto lerProduto(){ try{ FileInputStream leitura = new FileInputStream("c:/Aula/teste.txt"); ObjectInputStream objLeitura = new ObjectInputStream(leitura); Produto produto = (Produto)objLeitura.readObject(); objLeitura.close(); leitura.close(); return produto; }catch( Exception e ){ e.printStackTrace( ); } return null; } Na Classe de Teste Acrescentar: Produto p1 = new Produto("Arroz", "123456"); Utilidade u1 = new Utilidade(); u1.armazenarProduto(p1); Produto produtoRecuperado = u1.lerProduto(); System.out.println(produtoRecuperado.getNome()); System.out.println(produtoRecuperado.getCodigoBarras()); Criando o arquivo dentro do projeto Mudar a referência dos objetos: FileInputStream leitura = new FileInputStream("./teste.txt"); FileOutputStream gravacao = new FileOutputStream("./teste.txt"); Obs.: O “.” indica a raiz do projeto. Obs.: Se quiser que fiquem em alguma pasta, basta adicioná-la: "./arquivos/teste.txt" Dúvidas?