Sunday, November 25, 2007

Serialização de Objetos - Parte I

Quem trabalha com C# ou Java certamente irá encontrar em seu caminho a serialização de objetos, de forma mais ou menos rotineira. O interessante é que existem várias bibliotecas em Delphi que implementam métodos e classes para trabalhar com serialização, mas dificilmente encontramos código escrito utilizando este conceito. Uma destas bibliotecas era a Globus que foi depois incorporada pela gigante JEDI JVCL.

O conceito é simples: a partir de uma instância de uma classe qualquer – geralmente descendente de TPersistent – obtêm-se um XML que permita “reconstruir” esta instância mantendo-se todas as suas propriedades. Isto é conseguido fazendo extenso uso da RTTI (Run Time Type Information) para obter todas as propriedades Published da classe (somente as propriedades Published da classe geram informação de RTTI).

O processo de geração do XML que representará a classe é também simples: Percorre-se a lista de todas as propriedades Published da classe, convertendo cada property em um Tag correspondente, da forma:

<nome da propriedade>valor da propriedade</nome da propriedade>

Um TEdit por exemplo poderia ser representado pelo seguinte XML:

<TEdit>
    <Left>27</Left>
    <Top>59</Top>
    <Width>121</Width>
    <Height>21</Height>
    <Tag>1</Tag>
    <Visible>True</Visible>
</TEdit>

Atualmente venho utilizando a JVCL (classe TXMLSerializer) para serializar objetos. De fato, crei uma nova classe baseada na TXMLSerializer da JVCL, para ficar isolado de possíveis mudanças na JVCL - uma vez que da versão 2 para a 3 já ocorreram mudanças significativas, e não posso me dar ao luxo de reescrever código de produção sempre que a JVCL mudar.

O melhor de tudo é que migrei o TXMLSerializer para Delphi.NET (BDS 2006) - possuo um único código fonte para Win32 e .NET - e assim consigo serializar objetos entre aplicações Win32 e .NET, sem problemas, e sem precisar das monstruosidades dos parsers XML da MS, nem no ambiente Win32 nem no ambiente .NET.

Mais sobre este assunto depois!