Serialização de Variants
Estou trabalhando em um projeto que faz uso extensivo de variáveis do tipo Variant que precisam ser armazenadas em objetos TStream. Os valores podem ser de qualquer tipo: inteiros, strings, datas e até arrays. Os streams são então levados de um lugar para outro em arquivos ou diretamente pela rede para serem lidos por outro processo.
É claro que eu não fui o primeiro a ter essa necessidade, então antes de começar a quebrar a cabeça fui buscar no Google as soluções que já tinham sido criadas. Primeiro encontrei um comentário de Deborah Pate (TeamB) no newsgroup Borland “oleautomation”. Foi um bom começo, mas ainda faltava muito.
Mais tarde encontrei os posts de Nikolay Pavlov - nem acredito que encontrei um parente de Pavlov e ainda um que programa em Delphi! Nikolay estava bem mais próximo do que eu precisava, inclusive com o tratamento recursivo de arrays.
Como o código é livre, copiei, fiz diversas alterações e melhoramentos e estou publicando aqui a minha versão para quem se interessar.
Comments
4 Responses to “Serialização de Variants”
Deixe uma Resposta

Ola Daniel.
Em que tipo de aplicação poderiamos utilizar essa técnica?
Para enviar dados de uma “SELECT” num banco, por exemplo?
Alex, se você quiser guardar em um campo Blob no seu banco de dados é perfeitamente viável. Acho que é mais apropriado a aplicações de baixo nível, como transferências de dados por TCP/IP ou porta serial em que um TStream seja utilizado como fonte de dados.
As rotinas que eu fiz podem lidar com praticamente qualquer tipo de Variant. Até mesmo o conteúdo das propriedades Data e Delta de um TClientDataSet.
[...] algumas alterações na unit VarStreams (antiga StreamVars), que faz serialização genérica de Variants em objetos TStream e [...]
Ola Daniel
Por exemplo, gero um arquivo .PDF no servidor atraves de um metodo chamado pelo cliente, gostaria que este metodo tivesse um retorno VARIANT onde eu carregaria o .PDF em um TFileStream, e converteria o TFileStream em Variant e no cliente faria o processo inverso, é possivel usando a VarStreams?