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