Bom dia pessoal,

Hoje vamos ver Serialização que é bem utilizado na nossa realidade de desenvolvimento de projetos.

O que iremos ver será especificamente para a Certificação, não estenderei o conteúdo… Mas sintam-se à vontade para perguntar sobre o assunto.

 

O que é Serialização?

Serialização é guardar o estado de um objeto em bytes seja em disco ou em um stream.

 

Classes e métodos importantes

1. FileInputStream – Utilizada para ler bytes e transformar em objetos.

2. FileOutputStream – Utilizada para escrever objetos em bytes e guardar no disco.

3. ObjectInputStream - Classe de nível mais alto, ou seja, classe de encapsulamento. Nesse caso encapsula a classe FileInputStream.

3.1. readObject – método responsável por ler bytes e transformar em objeto.

3.2. defaultReadObject – inicia processo de deserialização.

3.3. readInt – retornar um valor int da deserialização.

4. ObjectOutputStream – Classe de nível mais alto, ou seja classe de encapsulamento. Nesse caso encapsula a classe FileOutputStream.

4.1. writeObject – método responsável por transformar o objeto em bytes no disco.

4.2. defaultWriteObject – inicia processo de serialização.

4.3. writeInt – escreve um valor int na serialização.

5. Serializable – Interface que indica se uma classe é serializável.

 

Considerações

1. Na deserialização não é chamado o construtor da classe do objeto deserializado, MAS quando houver herança teremos um comportamento diferente (fica para o próximo post para lhes deixarem curiosos =D).

 

Como serializar um objeto?

Vamos ver um exemplo bem simples :

public class ManipulandoSerializacaoSimples {

public static void main(String[] args) {

Pessoa pessoa = new Pessoa(“Dextrino”, new Endereco(“Campinas”, “SP”, “Brasil”));

try {

System.out.println(“Antes – Pessoa: “ + pessoa.getNome() + “, “ + pessoa.getEndereco().getEnderecoCompleto());

FileOutputStream fos = new FileOutputStream(“arquivo.txt”);

ObjectOutputStream oos = new ObjectOutputStream(fos);

// Escreve o objeto pessoa no arquivo.txt

oos.writeObject(pessoa);

oos.close();

} catch (Exception e) { e.printStackTrace(); }

try {

FileInputStream fis = new FileInputStream(“arquivo.txt”);

ObjectInputStream ois = new ObjectInputStream(fis);

// Le o arquivo.txt e referencia o objeto pessoa

pessoa = (Pessoa) ois.readObject();

ois.close();

// Repare que a classe Endereco implementa Serializable, portanto o atributo endereco foi serializado e deserializado

System.out.println(“Depois – Pessoa: “ + pessoa.getNome() + “, “ + pessoa.getEndereco().getEnderecoCompleto());

} catch (Exception e) { e.printStackTrace(); }

}

}

public class Pessoa implements Serializable {

private static final long serialVersionUID = 619337379561831879L;

private String nome;

private Endereco endereco;

public Pessoa(String nome, Endereco endereco) {

this.nome = nome;

this.endereco = endereco;

}

public String getNome() { return nome; }

public Endereco getEndereco() { return endereco; }

}

public class Endereco implements Serializable {

private static final long serialVersionUID = -9092198905086132027L;

private String cidade, estado, pais;

public Endereco(String cidade, String estado, String pais) {

this.cidade = cidade;

this.estado = estado;

this.pais = pais;

}

public String getCidade() { return cidade; }

public String getEstado() { return estado; }

public String getPais() { return pais; }

public String getEnderecoCompleto() { return cidade + “-” + estado + “, “ + pais; }

}

 

Considerações

1. Se a classe Endereco não fosse Serializable ocorreria a seguinte exceção:

java.io.NotSerializableException: br.com.certificacao.Endereco

 

Mas e se apenas quiséssemos que um atributo de endereço fosse serializado?

Utilizaríamos a palavra-chave transiente e reimplementaríamos os métodos writeObject e readObject.

 

Vejamos um exemplo com Produto e Embalagem.

public class ManipulandoSerializacaoComTransiente {

public static void main(String[] args) {

Produto produto = new Produto(“Dextrino”, new Embalagem(“Caixa com 10 unidades”, 10));

try {

System.out.println(“Antes – Produto: “ + produto.getNome() + “, “ + produto.getEmbalagem().getQuantidade());

FileOutputStream fos = new FileOutputStream(“arquivo.txt”);

ObjectOutputStream oos = new ObjectOutputStream(fos);

oos.writeObject(produto);

oos.close();

} catch (Exception e) { e.printStackTrace(); }

try {

FileInputStream fis = new FileInputStream(“arquivo.txt”);

ObjectInputStream ois = new ObjectInputStream(fis);

produto = (Produto) ois.readObject();

ois.close();

System.out.println(“Depois – Produto: “ + produto.getNome() + “, “ + produto.getEmbalagem().getQuantidade());

} catch (Exception e) { e.printStackTrace(); }

}

}

public class Produto implements Serializable {

private static final long serialVersionUID = 8973295619843486332L;

private String nome;

private transient Embalagem embalagem;

public Produto(String nome, Embalagem embalagem) {

this.nome = nome;

this.embalagem = embalagem;

}

public String getNome() { return nome; }

public Embalagem getEmbalagem() { return embalagem; }

// SO serializamos o atributo quantidade do atributo endereco

private void writeObject(ObjectOutputStream oos) {

try {

oos.defaultWriteObject();

oos.writeInt(embalagem.getQuantidade());

} catch (IOException e) { e.printStackTrace(); }

}

// SO deserializamos o atributo quantidade do atributo endereco

private void readObject(ObjectInputStream ois) {

try {

ois.defaultReadObject();

embalagem = new Embalagem(null, ois.readInt());

} catch (Exception e) { e.printStackTrace(); }

}

}

public class Embalagem {

private String descricao;

private Integer quantidade;

public Embalagem(String descricao, Integer quantidade) {

this.descricao = descricao;

this.quantidade = quantidade;

}

public String getDescricao() { return descricao; }

public Integer getQuantidade() { return quantidade; }

}

 

No próximo post iremos ver Serialização com herança e suas pegadinhas… até mais.

 

É isso ai pessoal, compartilhem, comentem e estudem!

 

Escrito por Marcos Oto Picarelli Prado