terça-feira, 23 de outubro de 2012

Serialização Parte II


Continuando o post anterior.... Vamos ver agora dois aspectos diferentes da serialização. Primeiro vamos generalizar a classe que tinhamos feito no post anterior.

Vamos ver a classe de serialização:

Vamos alterar agora a nossa chamada para o exemplo. Notem que a única diferença real é que agora temos que fazer o cast da linha 35 abaixo:


Rodamos a aplicação. Ok... Ela continua rodando!


Agora vamos ver outra opção. E se nós não quisermos que uma propriedade pública seja gravada (sei lá por que!). Para isto vamos derivar (o termo correto seria extender) uma classe nova a partir da ClasseSerializada que utilizamos no exemplo anterior. Vamos acrescentar um novo inteiro que chamaremos, com bastante inventividade, de inteiro2 e vamos fazer com que inteiro não seja serializado.

Vou dividir a apresentação da classe em duas partes só para ficar mais fácil a explicação.


Primeiro vamos notar como foi criada a classe
public class ClasseSerializada2 extends ClasseSerializada
quer dizer que estamos herdando na ClasseSerializada2 tudo que já foi feito na classe mãe. Usamos extends para dizer ao Java que estamos fazendo a classe filha.

Nas linhas 20 a 26 estamos criando a nova propriedade e encapsulando-a.

Vocês se lembram que tínhamos um método print para poder dar saída na console dos valores das propriedades? Como acrescentamos uma nova temos que fazer uma alteração para incluir a nova propriedade na impressão. Poderíamos criar um novo método imprimindo todas as propriedades, mas vamos aproveitar a facilidade que a herança nos permite.

Temos que fazer duas coisas para o código funcionar:
  • veja na linha 31 que colocamos uma anotação de Override, que indica ao java que este método substitui o da classe mãe
  • na linha 33 damos saída na nova propriedade
  • na linha 34 utilizamos um super.print(). Este super indica a classe mãe, assim estamos chamando dentro deste método da classe filha, o método original da classe mãe.
Vamos agora a segunda parte da classe. O procedimento de serialização verifica as propriedades que tenham uma propriedade transiente verdadeira, assim para que ela seja escondida basta trocar este valor para falso.

Como fazemos isto? Utilizamos uma classe java.beans.Introspector. Esta classe permite verificar as propriedades, eventos e métodos suportados por um bean. No nosso caso procuramos pela PropertyDescriptor cujo nome seja igual ao da propriedade que queremos ocultar (vejam as linhas 46 a 50).
Tendo localizado basta fazer o valor ser falso.

Você vai falar que não é isto que estou fazendo. É verdade!
No meu exemplo, eu na verdade estou trocando o status da propriedade. Se está true vira false e vice versa.

Como eu já sei que esta propriedade é criada por default como TRUE, ao chamar togglePropriedade("inteiro") o efeito que consigo é desativar transient da propriedade inteiro.

Dava para usar um operador ternário substituindo as linhas 51 a 55.

Vamos a teste. A classe é a mesma do exemplo passado ... TesteSerializacao. Somente foi adaptada para chamar a ClasseSerializada2.


Veja que interessante. A saída dos inteiros é invertida, primeiro aparece inteiro2 e depois inteiro. Está claro o porque?


Depois que a classe de deserializada o inteiro volta como zero. Quer dizer que ele não foi lido ou gravado? Vamos ver a saída XML para entender:
Onde foi parar <void property="inteiro"> ? Não existe no arquivo XML ... quer dizer que nossa alteração funcionou. Esta propriedade não foi serializada.

;-) Gostaram do visual do Notepad++?

Nenhum comentário:

Postar um comentário