sábado, 23 de agosto de 2014

Java – Persistência de Dados Com Serialização

Java – Persistência de Dados Com Serialização


    Depois de algum tempo sem postar artigos devido a falta de tempo aqui está eu de novo e o artigo de hoje será como guardar seus dados sem a necessidade de criar um banco de dados para isso. Vamos lá.

Com a Interface Serializable você pode guardar o estado do seu objeto ou seja se você criar um determinado objeto e atribuir valores a ele e serializar esse objeto, você terá todos os valores do objeto novamente, por exemplo se você criar um ArrayList e adicionar 10 inteiros a ele e serializa-lo, quando você recupera-lo você terá os 10 inteiros novamente não é demais?

    Para melhor entendimento criarei uma classe chamada Biblioteca uma vez que vamos simular um sistema simples de biblioteca, essa classe terá um ArrayList ao qual serão guardados os nossos livros e também terá o método main, também criarei uma classe chamada Livro essa classe deve implementar Serializable uma vez que para que possamos serializar uma classe ela deve implementar a interface Serializable, você deverá também fazero o seguinte import “import java.io.Serializable;” essa classe terá uma variável de instância chamada de nome a qual guardaremos o nome de cada livro. Abaixo como ficarão nossas classes:


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
import java.io.Serializable;
public class Livro implements Serializable {
private String nome;
 // no construtor passaremos o nome do livro
public Livro(String nome){
this.nome = nome;
}
 // Aqui podemos recuperar o nome do livro
public String getNome(){
return nome;
}
}
public class Biblioteca {
private static ArrayList<Livro> listLivros = new ArrayList<>();
public static void main(String[] args) {
     }
}

Agora precisamos criar os métodos para serializar e carregar nossos dados armazenados, para isso vamos criar um método na classe Biblioteca chamado serializa() que receberá como parâmetro o nome do arquivo e um ArrayList com os livros, como assim o nome do arquivo? quando você quer serializar um objeto você tem que criar um arquivo cuja extensão você escolhe, eu gosto de criar o arquivo com a extensão .ser (serializavel), enfim pode ser qualquer uma, voltando ao raciocínio depois de criar este arquivo.ser você vai gravar seus dados nele. Vejamos o método serializa():

    


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
// O método serializa recebe dois parametros o primeiro é o nome do arquivo
        //que vamos salvar como se fosse um bloco de notas (obs você pode colocar qualquer extensão
        // no nosso caso a extensão é .ser)
public static void serializa(String arquivo,ArrayList<Livro> livros){
try {
//criamos um objeto FileOutputStream que receberá uma String com o nome do
                //arquivo
FileOutputStream fos = new FileOutputStream(arquivo);
ObjectOutputStream oos = new ObjectOutputStream(fos);
               //pegamos o ObjectOutputStream para escrever com o método writeObject
                // e passamos o nosso ArrayList Como argumento
oos.writeObject(livros);
             // Em seguida fechamos ambos arquivos
fos.close();
oos.close();
            } catch (Exception e) {
          e.printStackTrace();
}
}

   

     Agora que já criamos o método serializa() precisamos de um método que recupere nossos dados para isso criaremos na classe Biblioteca o método load() que receberá como parâmetro o nome do arquivo (no nosso caso arquivo.ser) lembrando que na hora de recuperar nossos dados o nome do arquivo deve ter o mesmo nome e a mesma extensão que você deu ao seu arquivo, veja como ficará nosso método load():


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public static ArrayList<Livro> load(String arquivo){
 // crie um ArrayList de Livro para depois retorna-lo
            //com os dados recuperados do seu arquivo
ArrayList<Livro> lista = new ArrayList<>();
try {
 // Crie um objeto do tipo FileInputStream e passe como
                //parametro o nome do arquivo com a mesma extensao
FileInputStream fis = new FileInputStream(arquivo);
 // crie um objeto do tipo ObjectInputStream passando como
                //parametro o FileInputStream que você criou
ObjectInputStream ois = new ObjectInputStream(fis);
 // atribua a sua lista de Livros os dados recuperados
                //apartir do método readObject() do ObjectInputStream
lista = (ArrayList<Livro>) ois.readObject();
   //Feche
fis.close();
ois.close();
} catch (Exception e) {
e.printStackTrace();
}
    //retorne o ArrayList com os dados atualizados
return lista;
}


Agora vamos testar nossa pequena aplicação:



 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
public class Biblioteca {
private static ArrayList<Livro> listLivros = new ArrayList<>();
public static void main(String[] args) {
   //Aqui eu crio três livros
Livro lv1 = new Livro("Head First – Java");
Livro lv2 = new Livro("Head First – Python");
Livro lv3 = new Livro("Head First – Mysql");
 // Adiciono os livros na minha listLivros
listLivros.add(lv1);
listLivros.add(lv2);
listLivros.add(lv3);
 //Aqui eu gravo (serializo) meus dados no arquivo livro.ser
serializa("livro.ser", listLivros);
   // Recupero todos o ArrayList e percorro ele com um for
for (Livro livr : load("livro.ser")) {
 //imprimo cada item na tela
System.out.println(livr.getNome());
};
}


Quando você usar o método serializa() o arquivo será criado na pasta do seu projeto.

Termina aqui o nosso artigo sobre Serialização se você gostou comente.