Atenção: esse artigo tem um vídeo complementar. Clique e assista!

De que se trata o artigo

A finalidade deste artigo é apresentar a técnica de manipulação de objetos conhecida como serialização. A mesma é um processo em que se converte o estado de um objeto (informações associadas a este) para um formato (que será visto no decorrer do artigo) que permita posteriormente sua recuperação.

Em que situação o tema é útil

O tema é útil para operações que envolvam a gravação dos dados vinculados a um objeto em arquivos (para um uso futuro), como também a geração de pacotes em que a instância correspondente é formatada em um padrão específico para ser transmitida de uma aplicação para outra (através de uma rede, por exemplo).

Serialização - Gravando e recuperando a qualquer momento o estado de um objeto

A gravação de informações para uso posterior representa um tipo de necessidade bastante comum nos mais variados tipos de programas. Em muitos casos, por se procurar manter a simplicidade de uma aplicação, a utilização de um banco de dados é descartada. O processo conhecido como serialização disponibiliza alternativas para tais situações, já que este tipo de técnica permite salvar o conteúdo de um objeto para um arquivo, com a possibilidade ainda de recuperar tais dados num momento oportuno.

Utilitários como MP3 Player, aparelhos telefones entre outros, geralmente permitem muitas vezes a gravação de preferências e, até mesmo, mantêm um pequeno repositório de informações que são preservadas e recuperadas em cada ocasião na qual o programa em questão for acionado. A possibilidade de manter certos estados oferece a um usuário a chance de customizar certos comportamentos (como alguma preferencia do sistema em si) do software, sem que isto implique na perda de configurações que já haviam sido preenchidas.

Diferente de sistemas corporativos, os quais são projetados para operar em um contexto caracterizado por um grande volume de informações, aplicações mais simples costumam dispensar o uso de bancos relacionais. Os dados necessários à utilização de tais programas são normalmente gravados em arquivos, com essas estruturas servindo não apenas como meio para armazenamento, como também ponto de obtenção de informações processadas anteriormente.

Linguagens de programação baseadas em conceitos da Orientação a Objetos contam geralmente com alternativas para a implementação de funcionalidades desse gênero. Referências para uma determinada classe são geralmente convertidas para algum meio de armazenamento, visando à recuperação dos objetos correspondentes num momento futuro. O .NET Framework e Java são plataformas nas quais este tipo de técnica é suportado.

Ao procedimento de conversão de um objeto em um formato que permita sua reutilização futura dá-se o nome de serialização. A operação inversa a isto é conhecida como desserialização, sendo caracterizada pela geração de uma instância idêntica à referência original (incluindo todas as informações presentes nesta última).

Além da geração e consumo de arquivos por executáveis, a serialização é uma prática bastante utilizada na transmissão de objetos de um sistema a outro. Web Services constituem um bom exemplo disto, com os dados presentes em um objeto sendo organizados em um formato que viabiliza a transferência do serviço para uma aplicação que consome o mesmo.

Este artigo tem por finalidade demonstrar como o processo de serialização pode ser implementado em .NET. Para isto, será criada uma aplicação na qual se emprega esse tipo de recurso, com os arquivos resultantes servindo para recuperar instâncias exatamente iguais aos objetos em que os mesmos se basearam.

Nota do DevMan

O paradigma de desenvolvimento de software conhecido como Orientação a Objetos gira em torno dos conceitos de classe e objeto.

Objetos são representações dentro de um software para elementos presentes no mundo real. Um objeto conta normalmente com atributos e comportamentos. Atributos devem ser compreendidos como características que identificam um objeto. Já comportamentos correspondem a ações possíveis de se acionar a partir de um objeto, buscando a produção de algum resultado específico.

Uma classe é um template para a geração de objetos. Por template deve-se entender como uma estrutura, um “esqueleto”, que define quais atributos e comportamentos serão possíveis para um determinado objeto. Em termos práticos, um objeto é dito como sendo uma instância (ou referência) de uma classe.

Nota do DevMan

Web Services são estruturas (serviços) que expõem funcionalidades de negócio como métodos que poderão ser consumidos por outras aplicações. A comunicação entre um Web Service e um software que dependa do mesmo se faz geralmente via requisições HTTP. Devido a estas características, Web Services são um dos principais recursos utilizados na integração entre diferentes sistemas. Dentro da plataforma .NET, a tecnologia WCF (Windows Communication Foundation) representa o principal meio para a construção de soluções baseadas em serviços.

Serialização no .NET Framework: uma visão geral

Serialização é o processo em que se converte o estado de objeto de um modo que o mesmo possa ser persistido ou ainda, que facilite o seu transporte ao longo de um meio de transmissão como uma rede (a Internet, por exemplo). A desserialização é um tipo de operação em que acontece justamente o inverso, ou seja, a partir do resultado de algo que havia sido serializado obtém-se uma nova instância, exatamente igual à referência empregada inicialmente.

Por estado de um objeto devem ser consideradas informações presentes no mesmo e normalmente vinculadas às suas propriedades (ou campos). Já a noção de persistência refere-se a um procedimento no qual se gravam informações em estruturas como arquivos, com tais dados podendo ser obtidos novamente num momento posterior, basicamente através de operações de leitura executadas a partir do local em que estes itens foram armazenados.

O .NET Framework conta com os seguintes tipos de serialização:

• Serialização em formato binário: possibilita que o estado de propriedades (desconsideradas aquelas marcadas como somente leitura) e campos (variáveis de instância) de um objeto sejam preservados em meios como um arquivo em disco, um stream em memória, a partir da transmissão em rede de uma aplicação .NET para outra etc. Membros públicos, protegidos ou até mesmo privados são previstos dentro deste tipo de processo de serialização. Este processo é realizado através de instâncias da classe BinaryFormatter (namespace System.Runtime.Serialization.Formatters.Binary);

• Serialização em XML: apenas propriedades (executando aquelas definidas como somente leitura) e campos públicos de uma classe são considerados neste procedimento. Os mesmos meios de armazenamento disponíveis para a serialização binária também são válidos para este segundo caso. O procedimento que envolve o ato de serializar/desserializar um objeto em XML acontece por meio de referências geradas a partir do tipo XmlSerializer (declarado no namespace System.Xml.Serialization);

• Serialização no formato SOAP: neste tipo de técnica instâncias de objetos são formatadas seguindo a especificação SOAP, a qual representa o padrão de transmissão de dados mais utilizado por Web Services. Referências do tipo SoapFormatter (namespace System.Runtime.Serialization.Formatters.Soap) são utilizadas para efetuar operações baseadas na definição SOAP;

• Serialização customizada: implementada através de classes baseadas na interface ISerializable (estrutura pertencente ao namespace System.Runtime.Serialization), a qual conta com operações que permitem a implementação de comportamentos específicos a serem definidos para atividades de serialização/desserialização.

Nota do DevMan

Stream é uma sequência de dados de qualquer tamanho. Este tipo de estrutura representa a base a partir da qual a plataforma .NET possibilita a manipulação de arquivos e outros agrupamentos de informações, através de tipos envolvidos em operações de escrita e leitura. As diferentes classes e mecanismos para tratamento de streams encontram-se disponíveis no namespace System.IO.

XML é um formato baseado em marcações (tags), sendo considerada uma espécie de metalinguagem. O mesmo pode ser entendido como um conjunto de regras para a criação de uma nova linguagem: não existem tags pré-definidas, com as marcações sendo estipuladas conforme uma demanda específica.

Documentos em XML são formados por um conjunto de elementos (nodes), com as relações de dependência sendo estabelecidas por meio de níveis de hierarquia. Um elemento, por sua vez, é constituído por uma tag e seu respectivo conteúdo. Quanto ao conteúdo, um elemento pode estar vazio, possuir atributos ou mesmo, conter um agrupamento de outros elementos. Já um atributo é formado por um par constituído de um nome e um valor correspondente (entre aspas), sendo que estes dois itens encontram-se separados por um sinal de “=” (“igual”) e são declarados dentro da tag que define um elemento.

...

Quer ler esse conteúdo completo? Tenha acesso completo