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
RSS dos comentários deste post · TrackBack URI
Comente