Início > Visual Studio / .Net > .Net Serialize e Deserialize

.Net Serialize e Deserialize

Hoje resolvi escrever um post mais técnico sobre .Net. O objetivo do trabalho é serializar uma classe através de um método genérico. A principal vantagem de Serializar/Deserializar objetos é quando precisamos trafegar suas informações entre sistemas distintos. Por exemplo: no momento que fecho um pedido em um e-commerce, devo enviar as informações para o ERP da empresa para que a área comercial dê andamento no processo. Esse processo provavelmente será feito através de uma integração SOAP, XML, WCF. Então seria necessário eu montar um XML manualmente e preencher todas as informações em cada um dos campos necessários. Se eu transformar o meu objeto “Pedido” em um XML, fica muito mais simples e rápido. Se por exemplo criarmos novas propriedades, não teremos o trabalho de mexer no envio do pedido para o ERP. Falando mais de código fonte, criei um projeto Class Libary no VS2010 com três classes:

  • Pessoa: uma classe com as propriedades necessárias
  • Pessoa Física: herda da classe “Pessoa” e tem as propriedades de uma pessoa física
  • Address: endereço com suas propriedades necessárias

——————–

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Xml.Serialization;

namespace Augusto.Pierzynski
{
    public class Pessoa
    {
        public int id { get; set; }
        public string name { get; set; }
        public string image { get; set; }

        [XmlIgnore]
        public List AddressList { get; set; }
    }
}

——————–

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Xml.Serialization;

namespace Augusto.Pierzynski
{
    public class PessoaFisica : Pessoa
    {
        public int id { get; set; }
        public string cpf { get; set; }
        public string rg { get; set; }

    }
}

——————–

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Augusto.Pierzynski
{
    public class Address
    {
        public int id { get; set; }
        public string address_firstfield { get; set; }
        public string address_secondfield { get; set; }
        public string zipcode { get; set; }
        public string zone { get; set; }

    }
}

——————–

Para serializar a classe PessoaFisica,  criei 2 métodos “Serialize” e “Deserialize” dentro da classe Pessoa conforme abaixo. Note que nos dois métodos existem casts com o objeto pessoa.

——————–

        public virtual string Serialize()
        {
            StringWriter xText = new StringWriter();
            XmlSerializer xSerializer = new XmlSerializer(typeof(Pessoa));
            xSerializer.Serialize(xText, this);
            return xText.ToString();
        }

        public virtual Pessoa Deserialize(string strPessoa)
        {
            if (strPessoa == null)
            {
                return new Pessoa();
            }

            XmlSerializer xSerializer = new XmlSerializer(typeof(Pessoa));
            return (Pessoa)xSerializer.Deserialize(new StringReader(strPessoa));
        }

——————–

Na classe pessoa física, foi necessário sobrescrever os dois métodos com o cast para a classe PessoaFisica. Note que o método Deserialize retorna um tipo “Pessoa” (pai), mas faz o cast com “PessoaFisica”.

——————–

        public override string Serialize()
        {
            StringWriter xText = new StringWriter();
            XmlSerializer xSerializer = new XmlSerializer(typeof(PessoaFisica));
            xSerializer.Serialize(xText, this);
            return xText.ToString();
        }

        public override Pessoa Deserialize(string strPessoaFisica)
        {
            if (strPessoaFisica == null)
            {
                return new PessoaFisica();
            }

            XmlSerializer xSerializer = new XmlSerializer(typeof(PessoaFisica));
            return (PessoaFisica)xSerializer.Deserialize
                                            (new StringReader(strPessoaFisica));
        }

——————–

As vezes não queremos (ou não podemos, no caso de propriedades readonly) que algum parâmetro da classe seja serializado, então podemos utilizar o atributo [XmlIgnore]. O truque no momento de Serializar/Deserializar é fazer o cast para o objeto correto, conforme segue abaixo:

——————–

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Augusto.Pierzynski
{
    class Test
    {

        public void main()
        {
            PessoaFisica objPessoaFisica = new PessoaFisica();
            objPessoaFisica.id = 10;
            objPessoaFisica.image = "";
            objPessoaFisica.name = "João";
            objPessoaFisica.rg = "xx.xxx.xxx-x";

            string objPessoaFisicaSerialize = objPessoaFisica.Serialize();

            PessoaFisica objPessoaFisica2 = (PessoaFisica)
                 (new PessoaFisica()).Deserialize(objPessoaFisicaSerialize);

        }

    }
}
--------------------
Anúncios
  1. Nenhum comentário ainda.
  1. No trackbacks yet.

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: