Por que eu devo ler este artigo:A serialização permite que aplicações de diferentes plataformas possam trocar informações sem que tenham qualquer biblioteca compartilhada, apenas usando protocolos e padrões de formatação e armazenamento dos dados. O artigo mostra os primeiros passos, classes, métodos e práticas a serem tomadas para realizar a serialização de objetos usando os recursos do framework .NET e a linguagem C#.

Um problema muito comum enfrentado por quem precisa utilizar programas que exportam ou importam informações a partir de arquivos gerados por outrem, é a incompatibilidade entre versões. Às vezes, um documento de texto ou um arquivo de imagem criado com uma versão de um software não pode ser aberto ou utilizado corretamente por outra versão do mesmo software, ou ainda por outro software de função equivalente.

Atualmente é grande o número de programas, formatos de arquivo e plataformas que precisam ser interconectadas. Por exemplo, é bem provável que os dados que sejam inseridos em uma aplicação desktop, sejam vistos posteriormente em uma aplicação na web ou enviados para algum dispositivo móvel.

No início havia pouco problema, porque também o número de plataformas era reduzido. Basicamente havia um ou dois sistemas operacionais e o formato usado era o texto puro, seguido de um arquivo indicando o layout, indicando onde um campo terminava e outro começava, basicamente indicando a coluna de início e o comprimento esperado dos dados.

Também não era problema o idioma usado, pois no início da programação o inglês imperava e coisas como acentos e caracteres especiais – que complicam a interoperabilidade quando projetos rodam em idiomas diferentes – ainda não eram suportadas.

Com a evolução, surgiram questões que precisaram ser resolvidas e a troca de dados entre os programas foi o ponto primeiro a ser atacado. Ao ler isto, pode-se ter a impressão de que a interoperabilidade é uma questão menor, porque os arquivos de texto são suficientemente eficazes para armazenar dados e facilmente de serem manipulados. Mas vejamos alguns dados:

  1. Textos precisam ser representados de forma linear e contínua. Como fazer para representar objetos complexos que possuem objetos aninhados e listas de outros objetos?
  2. Cada idioma tem o seu conjunto de caracteres específico. Considere a simples tarefa de enviar um texto em português para um programa sendo executado no idioma inglês (que como sabemos, não tem acentos nem os mesmos símbolos do nosso idioma).
  3. Com o surgimento de linguagens orientadas a objeto, os dados passaram a ser estruturados de uma forma mais rica e complexa, para que pudesse se representar o mundo real através de analogias como modelos (classes) e objetos (instâncias).

Logo, para que uma aplicação possa usar os dados, é necessário saber como estão estruturados, conhecendo não só os nomes usados, mas também os tipos de dados.

Uma solução abrangente

Não demorou e começaram a surgir formas de se representar estes dados de uma forma eficaz e que pudesse ser adotada pelo maior número de aplicações: a serialização.

Em linhas gerais, ela consiste em descobrir a estrutura de um determinado objeto ou dado e prepará-lo para ser armazenado ou transmitido pela rede de uma maneira portável, que possa ser lida por outra aplicação que conheça o padrão. Neste processo são transmitidos:

  1. A estrutura dos dados – nomes de propriedades, seus tipos e hierarquia;
  2. Os dados propriamente dito;
  3. Como fazer para restaurar os dados.

Usando uma analogia, a serialização é o teletransporte do mundo do desenvolvimento de software. Você coleta todas as informações sobre o dado a ser serializado, ordena esses metadados (dados sobre dados) de alguma forma e transmite.

Na outra ponta, o programa que for ler, já conhecendo o protocolo e o funcionamento deste processo, materializa o objeto usando esses metadados.

Assim, o fluxo de serialização pode ser simplificado da seguinte forma;

  1. Descobrir a estrutura do objeto: quais os nomes dos seus elementos, objetos, propriedades e quais os seus tipos;
  2. Fazer o mesmo para cada objeto aninhado até que não haja mais nenhum a ser descoberto;
  3. Associar os valores aos objetos;
  4. Transformar os dados para envio usando um formato pré-estabelecido.

Embora a colocação destes passos possa parecer simples, considere como fazer para descobrir quais são as propriedades e elementos de um objeto, sendo que você não tem acesso ao código do mesmo, apenas uma amostra de uma instância deste objeto. Isto é mandatório para que a serialização possa ser largamente empregada.

Qualquer desenvolvedor pode serializar um objeto se conhecer sua estrutura, mas como fazer sem acesso ao seu código?

Neste ponto entra uma técnica muito difundida entre as linguagens de programação de várias plataformas chamada Reflection. Ela consiste em recursos para ler quais são as propriedades, tipos, métodos e valores de um objeto a partir de sua instância. No Framework .NET você irá encontrar este recurso no namespace classe System.Reflection.

Nota

Usar Reflection é, por si só, uma tarefa longa e cheia de detalhes que não cabem neste artigo, e por isso serão apenas citados. Para obter mais detalhes, verifique a sessão Links deste artigo.

Formas de serializar

Basicamente, são utilizadas duas formas de serialização:

  • Binária: os dados são transformados em uma sequência de bytes. É mais complexa para enviar dados através da rede, porque pode implicar em problemas de segurança e os dados podem ser barrados por antivírus e firewalls.
  • Texto: os dados são estruturados usando fluxos de texto puro em uma determinada codificação. É a forma preferível quando se quer trocar dados entre plataformas diferentes e também quando estes precisam trafegar por uma rede, pois não representam ameaças à segurança.

Sobre a serialização binária não há maiores considerações a serem feitas, pois como foi colocado, trata-se apenas de fluxo de bytes. Já realizar serialização no formato texto implica em escolher um jeito de estruturar as informações.

Aqui entra um formato já bem conhecido e utilizado há bastante tempo, o XML, e um mais recente, mas que já tem um espaço importante na representação e transporte de informações, o JSON.

Arquivos XML consistem de marcações ou tags, que podem ser aninhadas hierarquicamente, e por ser um formato de texto, podem ser lidos por qualquer editor de texto. A Figura 1 mostra um exemplo de arquivo XML aberto no navegador de internet.

Exemplo de documento XML visualizado no browser

Figura 1. Exemplo de documento XML visualizado no browser

O termo JSON é o acrônimo para JavaScript Object Notation e como o nome diz, é um formato para representação de objetos da linguagem JavaScript que vem sendo largamente empregado em aplicações web, ou que simplesmente façam uso deste formato por causa da simplicidade para gerar e recuperar os dados.

Ao visualizar um exemplo de objeto serializado desta forma (Figura 2) percebe-se uma grande similaridade com o XML.

Exemplo de representação JSON de documento ...
Quer ler esse conteúdo completo? Tenha acesso completo