C# -  Serializando Objetos para String e vice-versa

 

 Neste artigo vou mostrar como podemos serializar objetos para string e vice-versa.

Já ouviu falar em serialização ?


 

O que é serializar ?

Como podemos fazer isto na plataforma .NET ?

De forma direta: A serialização é o processo de armazenar um objeto, incluindo todos os atributos públicos e privados para um stream.

Nota: Tradução de stream - fluxo (no caso de dados) . Melhor deixar stream mesmo.

De forma genérica a serialização é uma técnica usada para persistir objetos, ou seja:  gravar objetos em disco , fazer a transmissão remota de objetos via rede , armazenar os objetos em um banco de dados e/ou arquivos (binários , xml, etc.)

Assim, serializar nada mais é do que colocar os valores que o objeto está utilizando juntamente com suas propriedades de uma forma que fique em série (sequencial). Fazendo isto estamos tornando o objeto Serializable, e, tornando um objeto Serializable, estamos atribuindo essa qualidade a ele, e dando privilégios para que o mesmo possa ser gravado em disco ou enviado por rede ou persistindo como binário/XML.

Se você faz a serialização naturalmente vai querer fazer o processo inverso - deserialização, que seria restaurar os atributos de um objeto gravado em um stream. (Este stream pode ser um arquivo binário, xml , etc.)

Por que você iria querer usar a serialização ? 

Primeiro porque nem tudo se pode armazenar em um banco de dados. As vezes a natureza da sua aplicação não exige um banco de dados ou usar um banco de dados pode ficar muito caro para o tamanho dos dados que se quer guardar ou ainda você pode também querer gravar os dados em disco para posterior recuperação. Enfim, se você não quer usar um banco de dados, e quer persistir seus objetos pode fazer isto de diversas maneiras mas o trabalho exigirá mais código, mais trabalho e mais tempo.

A plataforma .NET oferece recursos que tornam as tarefas de Serializar e Deserializar, tarefas muito simples de serem realizadas.

Neste artigo vou mostrar como podemos serializar e deserializar objetos usando a linguagem C#.

Recursos usados :

Criando o projeto no VS 2015

Abra o VS Community 2015  e clique em New Project; A seguir selecione Visual C# -> Windows -> Windows Forms Application e Informe o nome Serializar_Objetos e clique no botão OK;

A partir da ToolBox inclua os seguintes controles no formulário form1.vb:

Abaixo leiaute do formulário:
 

 

No menu Project clique em Add Class e informe o nome Pessoa.

 

A seguir inclua o código abaixo na classe Pessoa que será a classe que iremos usar para serializar objetos.

 

namespace Serializar_Objetos
{
    public class Pessoa
    {
        public string Nome { get; set; }
        public string Email { get; set; }
        public string ID { get; set; }
    }
}

 

Vamos definir os namespaces usados no projeto:

using System;
using
System.Windows.Forms;

A seguir vamos definir a variável p do tipo Pessoa e a variável string oPessoaString;

Pessoa p;
string oPessoaString;

a variável objeto p do tipo Pessoa irá receber o objeto serializado e a variável string oPessoaString irá receber o objeto deserializado.

Agora vamos criar a classe Persistencia no projeto e definir nela dois métodos:

No menu Project clique em Add Class e informe o nome Persistencia.

 

A seguir inclua o código abaixo na classe Persistencia que será a classe que iremos usar para serializar e deserializar objetos:

 

using System;
using System.IO;
using System.Xml.Serialization;

namespace Serializar_Objetos
{
    public static class Persistencia
    {
        public static string SerializaParaString<T>(this T valor)
        {
            try
            {
                XmlSerializer xml = new XmlSerializer(valor.GetType());
                StringWriter retorno = new StringWriter();
                xml.Serialize(retorno, valor);
                return retorno.ToString();
            }
            catch
            {
                throw;
            }
        }

        public static object DeserializaParaObjeto(string valor, Type tipo)
        {
            try
            {
                XmlSerializer xml = new XmlSerializer(tipo);
                var valor_serealizado = new StringReader(valor);
                return xml.Deserialize(valor_serealizado);
            }
            catch
            {
                throw;
            }
        }
     }
}

 

Observe que a classe Persistencia é uma classe estática o que significa que ela não pode ser instanciada; ou seja, você não pode usar a palavra new para criar uma variável do tipo da classe.

 

O acesso aos membros da classe estática é feito usando o nome da classe seguido de ponto e dos métodos definidos na classe.

 

A seguir temos uma relação das características de uma classe estática:

Serializando e Deserializando objetos

 

Vamos agora implementar o código para serializar e deserializar objetos.

 

No evento Click do botão - Cria Instância da Classe - inclua o código abaixo:

 

      private void btnInstanciar_Click(object sender, EventArgs e)
        {
            if (string.IsNullOrEmpty(txtID.Text) && string.IsNullOrEmpty(txtNome.Text) && string.IsNullOrEmpty(txtEmail.Text))
            {
                MessageBox.Show("Informe os valores para ID, Nome e Email");
            }
            else
            {
                p = new Pessoa();
                p.ID = txtID.Text;
                p.Nome = txtNome.Text;
                p.Email = txtEmail.Text;
                MessageBox.Show("Objeto Pessoa 'p' criado com sucesso !");
            }
        }


Este código apenas cria uma instância da classe Pessoa, ou seja, cria o objeto p, com os dados inseridos no formulário.

 

Serializando objetos

 

Agora vamos definir o código no evento Click do botão Serializar :

 

        private void btnSerializar_Click(object sender, EventArgs e)
        {
            try
            {
                if( p == null)
                {
                    MessageBox.Show("Não Existe instância da classe Pessoa criada !");
                }
                else
                {
                    oPessoaString = Persistencia.SerializaParaString<Pessoa>(p);
                    txtDados.Text = oPessoaString;
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Erro :" + ex.Message);
            }
        }

 

Neste código verificamos se existência o objeto p e a seguir usamos o método SerializaParaString da classe Persistencia para serializar o objeto p exibindo o resultado, um arquivo XML, no TextBox - txtDados.

 

Deserializando objetos

 

Para realizar o processo inverso vamos definir o código a seguir no evento Click do botão Deserializar :

 

        private void btnDeserializar_Click(object sender, EventArgs e)
        {
            try
            {
                Pessoa oPessoa = (Pessoa)Persistencia.DeserializaParaObjeto(oPessoaString, p.GetType());

                txtID_o.Text = oPessoa.ID;
                txtNome_o.Text = oPessoa.Nome;
                txtEmail_o.Text = oPessoa.Email;
            }
            catch(Exception ex)
            {
                MessageBox.Show("Erro :" + ex.Message);
            }
        }

 

Neste código usamos o método DeserializaParaObjeto() da classe Persistencia para retornar o objeto para string; a seguir exibimos as informações do objeto nas caixas de texto do formulário.

Pegue o projeto completo aqui :   Serializar_Objetos.zip

Respondeu Jesus: O meu reino não é deste mundo; se o meu reino fosse deste mundo, pelejariam os meus servos, para que eu não fosse entregue aos judeus; mas agora o meu reino não é daqui.
João 18:36

Referências:


José Carlos Macoratti