Persistencia com XMLEncoder e XMLDecoder.
A classe XMLEncoder é uma alternativa complementar à ObjectOutputStream e pode ser usado para gerar uma representação textual de um JavaBean da mesma maneira que o ObjectOutputStream pode ser usado para criar a representação binária de objectos Serializáveis.
Com XMLEncoder podemos persistir nossos Objetos de uma forma similar a Serialização, porém nossos objetos serão armazenados em um arquivo xml.
Vamos criar um projeto no Eclipse de forma que fique mais claro ver como a classe XMLEncoder Trabalha, para isso vamos abrir o Eclipse e criar um projeto chamado "Aula XmlEncoder" (você pode escolher o nome que quiser) o nome do pacote daremos o seguinte com.renanwillamy.xmlencoder, agora vamos criar a classe Pessoa ela terá as seguintes variáveis nome,cpf e endereço todas do tipo String. veja abaixo como a classe deve ficar.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | package com.renanwillamy.xmlencoder; public class Pessoa { private String nome,cpf,endereco; public Pessoa() { // TODO Auto-generated constructor stub } public Pessoa(String nome, String cpf, String endereco) { super(); this.nome = nome; this.cpf = cpf; this.endereco = endereco; } public String getNome() { return nome; } public void setNome(String nome) { this.nome = nome; } public String getCpf() { return cpf; } public void setCpf(String cpf) { this.cpf = cpf; } public String getEndereco() { return endereco; } public void setEndereco(String endereco) { this.endereco = endereco; } } |
É importante que a classe que vai ser armazenada tenha todos os getters e setters, no nosso caso a classe Pessoa, perceba que para todas as variáveis da classe Pessoa foi criado um método get e um set para cada variável, pois para que a classe XMLEncoder funcione perfeitamente temos que fazer isso.
Agora vamos criar a classe responsável por persistir nossos objetos, crie uma classe chamada Persistencia que vai ter dois métodos um para salvar e outro para recuperar nossos objetos, veja abaixo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | package com.renanwillamy.xmlencoder; import java.beans.XMLDecoder; import java.beans.XMLEncoder; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; public class Persistencia { /* Passamos um Object como parametro, pois como todo objeto herda * de Object podemos passar qualquer objeto como argumento, também * passamos uma String que vai ser o nome do nosso arquivo xml*/ public void salva(Object object,String fileName){ BufferedOutputStream buf; try { FileOutputStream fos = new FileOutputStream(fileName); buf = new BufferedOutputStream(fos); XMLEncoder xml = new XMLEncoder(buf); xml.writeObject(object); xml.close(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } } // auqui passamos apenas o nome do nosso arquivo xml public Object load(String fileName){ FileInputStream fis; try { fis = new FileInputStream(fileName); BufferedInputStream buf = new BufferedInputStream(fis); XMLDecoder xml = new XMLDecoder(buf); Object object = xml.readObject(); xml.close(); return object; } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } // Caso ocorra algum erro retorna null return null; } } |
Agora vamos criar uma classe que vai testar nossas classes, crie uma classe chamada Principal
ela vai ter um método main onde vamos testar os métodos salva() e load().
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | package com.renanwillamy.xmlencoder; public class Principal { public static void main(String[] args) { Persistencia pers = new Persistencia(); Pessoa pessoa = new Pessoa("Renan", "00005542", "Rua fulano de tal"); pers.salva(pessoa, "pessoa.xml"); System.out.println(pessoa.getNome()+" : "+pessoa.getCpf()); } } |
No código acima criamos uma classe chamada Principal e em seu método main criamos um objeto pers (da classe Persistencia) e um objeto pessoa que tem os seguintes dados: nome = Renan, cpf = 0005542 e endereco = Rua fulano de tal, logo após criarmos o objeto pessoa armazenamos ele em xml através do método salva do objeto pers, como não estamos especificando um local para o arquivo xml ser armazenado ele será armazenado dentro da pasta do seu projeto, você pode abrir o arquivo xml e ver os dados armazenados de cada variável do nosso objeto pessoa. Depois imprimimos na tela o nome e o cpf do objeto pessoa.
Agora vamos recuperar nosso objeto através do método load() que nós criamos na classe Persistencia, veja abaixo.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | package com.renanwillamy.xmlencoder; public class Principal { public static void main(String[] args) { Persistencia pers = new Persistencia(); Pessoa pessoa = (Pessoa) pers.load("pessoa.xml"); System.out.println(pessoa.getNome()+" : "+pessoa.getCpf()); } } |
Neste trecho de código acima criamos um objeto pers (da classe Persistencia), criamos um objeto pessoa que vai receber um objeto pessoa que é retornado pelo método load() passando como argumento o nome do arquivo xml no nosso caso pesssoa.xml. Como o método load() retorna um object precisamos fazer um cast (Pessoa) quando for atribuir o valor retornado pelo método load() à variável pessoa, é como se fosse uma forma de avisar a Máquina Virtual Java que nós temos certeza que o objeto retornado pelo método load() é um objeto pessoa, depois imprimimos na tela o nome e o cpf do objeto pessoa.
O resultado será:
Renan : 00005542
Uma forma de trabalhar com armazenamento de dados em xml é usando ArrayList pois como o ArrayList também é um objeto podemos armazena-lo sem problemas, vamos aproveitar o nosso exemplo e criar outros objetos de Pessoa cada um com seus respectivos nomes,cpfs e endereços, como nós já temos um método que salva um objeto e nós sabemos que o ArrayList é um objeto, tudo que devemos fazer é adicionar nossos objetos pessoa ao nosso ArrayList e depois salvar-lo, vejamos abaixo.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | package com.renanwillamy.xmlencoder; import java.util.ArrayList; public class Principal { public static void main(String[] args) { //Criamos um ArrayList ArrayList<Pessoa> listaPessoas = new ArrayList<>(); //criamos nosso objeto de persistencia Persistencia pers = new Persistencia(); //Criamos nossos objetos pessoas cada um com seus proprios dados Pessoa pessoa1 = new Pessoa("Renan", "12.488.115.68", "Rua fulano de tal"); Pessoa pessoa2 = new Pessoa("José", "13.498.215.22", "Rua beltrano de tal"); Pessoa pessoa3 = new Pessoa("Maria", "25.325.185.84", "Rua cicrano de tal"); Pessoa pessoa4 = new Pessoa("Paulo", "00.188.315.18", "Rua alguma coisa de tal"); //adicionamos nosso objetos pessoa no ArrayList listaPessoas.add(pessoa1); listaPessoas.add(pessoa2); listaPessoas.add(pessoa3); listaPessoas.add(pessoa4); //Salvamos nosso ArrayList pers.salva(listaPessoas, "lista_de_pessoas.xml"); } } |
Agora que já armazenamos nosso ArrayList vamos recupera-lo e mostrar os nomes e cpfs de todos os objetos pessoa que estão em nosso ArrayList, veja:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | package com.renanwillamy.xmlencoder; import java.util.ArrayList; public class Principal { public static void main(String[] args) { //criamos nosso objeto de persistencia Persistencia pers = new Persistencia(); //recuperamos nosso Objeto ArrayList ArrayList<Pessoa> listaPessoas = (ArrayList<Pessoa>) pers.load("lista_de_pessoas.xml"); // percorremos o nosso ArrayList e imprimimos os nomes e cpfs de cada pessoa //do nosso ArrayList for (Pessoa pessoa : listaPessoas) { System.out.println("Nome : "+pessoa.getNome()+" Cpf : "+pessoa.getCpf()); } } } |
Agora criamos um objeto de Persistencia pers criamos uma variável listaPessoas do tipo ArrayList<Pessoa> e atribuímos a ela o valor que é retornado através do método load() do nosso objeto pers observe que depois do sinal de igual fizemos novamente um cast que é esse ArrayList<Pessoa> entre parênteses, isso é porque nosso método load() retorna um objeto e com esse cast nós estamos informando a Maquina Virtual java que nós temos certeza que o objeto que está sendo retornado é um ArrayList<Pessoa>, depois nós criamos um for para percorrer todo o nosso ArrayList e imprimimos na tela todos os nomes e cpfs de todos os objetos pessoa que estão no ArrayList.
O resultado será:
Nome : Renan Cpf : 12.488.115.68
Nome : José Cpf : 13.498.215.22
Nome : Maria Cpf : 25.325.185.84
Nome : Paulo Cpf : 00.188.315.18
Nenhum comentário:
Postar um comentário