segunda-feira, 25 de agosto de 2014

Persistencia com XMLEncoder e XMLDecoder.

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