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.
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++?