quinta-feira, 24 de outubro de 2013

Objeto para String - Serializar

Imagine que você tem um objeto e queira guardar ele em  banco de dados ou em um arquivo XML no seu estado atual.
Para isso precisaremos serializar o objeto jogando o valor para uma string.

Temos o seguinte objeto:
public class usuario
{

    public string nome;
    public string email;
    public bool ativo;
}


Precisaremos criar dois métodos, um que pega um determinado objeto e o transforma em string o outro fará o inverso.

  public static string ParaString<T>(this T valor)
  {
      XmlSerializer xml = new XmlSerializer(valor.GetType());
      StringWriter retorno = new StringWriter();
      xml.Serialize(retorno, valor);
      return retorno.ToString();
  }
  public static object ParaObjeto(string valor, Type tipo)
  {
      XmlSerializer xml = new XmlSerializer(tipo);
      var valor_serealizado = new StringReader(valor);
      return xml.Deserialize(valor_serealizado);
  }



Vou criar uma instância dessa classe com o nome de u.
usuario u = new usuario();
       u.nome = "Celso";
       u.email = "czequim@gmail.com";
       u.ativo = true;
já temos o nosso objeto criado agora precisamos serealizar.
string retorno = ParaString<usuario>(u);

O conteúdo da variável retorno será:
<usuario xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <nome>Celso</nome>
  <email>czequim@gmail.com</email>
  <ativo>true</ativo>
</usuario>

Agora se você tem esse valor em uma string e quiser fazer o inverso, transformar esse xml em um objeto. É só chamar o segundo método.
usuario Objeto =(usuario) ParaObjeto(retorno, u.GetType());


Simples assim. :D

Se for um List o processo é o mesmo.
Veja o exemplo:
List<usuario> usuarios = new List<usuario>();

     for (int i = 0; i < 10; i++)
     {
usuario u = new usuario();
       u.nome = "Celso";
u.email = "czequim@gmail.com";
       u.ativo = true;           
     }
           

     string retorno = ParaString<List<usuario>>(usuarios);          
           
           
     List< usuario> Objeto =(List<usuario>) ParaObjeto(retorno, usuarios.GetType());


simples assim também.... :D