Skip to main content

Criar XML a partir de uma classe modelo utilizando Serialize e Deserialize

Neste post vou mostrar como montar um XML a partir de uma classe modelo utilizando o Serilize do c#.
Dica: pode ser utilizado em uma aplicação que tenha um formulário e por algum motivo desconhecido o usuário não esta conseguindo salvar os dados, logo no tratamento da exceção  da aplicação pode-se armazenar os dados do formulário em um arquivo xml utilizando o Serialize e enviar por e-mail para equipe de desenvolvimento, que por sua vez com os dados do usuário fica mais fácil simular o erro e corrigi-lo mais rapidamente.
Crie um novo projeto no Visual Studio do tipo ASP.NET Web Application (C#), monte uma pagina de acordo com os elementos da imagem abaixo

No evento do botão que ira salvar os dados do formulário vou capturar os dados do informados pelo usuário e armazena-los utilizando minha classe modelo com as seguintes propriedades.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace XML_Serialize
{
    public class USUARIO
    {
        public string NOME{get;set;}
        public int SEXO{get;set;}
        public DateTime DATA_NASCIMENTO{get;set;}
        public string TELEFONE{get;set;}
    }
}
Vou criar também uma classe com os métodos que executaram a serialização e deserialização.
Ao executar a deserialização é necessário fechar o arquivo, pois se o usuário abrir o mesmo arquivo de novo não será possível pois o mesmo já esta aberto.

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

namespace XML_Serialize
{
    public class Ferramenta_serialize
    {
        internal string SerializeObject(USUARIO user,string caminhoServidor)
        {
            StringBuilder xm = new StringBuilder();

            MemoryStream memoryStream = new MemoryStream();
            XmlSerializer xs = new XmlSerializer(user.GetType());
            XmlTextWriter xmlTextWriter = new XmlTextWriter(memoryStream, Encoding.UTF8);

            xs.Serialize(xmlTextWriter, user);
            memoryStream = (MemoryStream)xmlTextWriter.BaseStream;
            xm.Append(UTF8ByteArrayToString(memoryStream.ToArray()));

            //cria o arquivo mesmo que não exista
            string file_ =  user.NOME + ".xml";
            StreamWriter valor = new StreamWriter(caminhoServidor + "\\" + file_);
            valor.Write(xm.ToString().Trim());
            valor.Close();
            return file_;
        }

        internal USUARIO DeserializeObject(System.Web.UI.WebControls.FileUpload fu_XML)
        {
            XmlSerializer xs = new XmlSerializer(typeof(USUARIO));
            FileStream fs = new FileStream(fu_XML.PostedFile.FileName, FileMode.Open);
            XmlReader reader = new XmlTextReader(fs);

            USUARIO user = xs.Deserialize(reader)as USUARIO;
            reader.Close();

            return user;
        }
        /// <summary>
        /// converte um Array de Byte Unicode (UTF-8 encoded) para uma String.
        /// </summary>
        /// <param name="characters">Unicode Array de Byte's para comverter em String</param>
        /// <returns>String formada por Array de Byte's</returns>
        private String UTF8ByteArrayToString(Byte[] characters)
        {
            UTF8Encoding encoding = new UTF8Encoding();
            String constructedString = encoding.GetString(characters);
            return (constructedString);
        }
        /// <summary>
        /// Converte uma String em Array de Byte's UTF-8
        /// </summary>
        /// <param name="XMLString"></param>
        /// <returns></returns>
        private Byte[] StringToUTF8ByteArray(String XMLString)
        {
            UTF8Encoding encoding = new UTF8Encoding();
            Byte[] byteArray = encoding.GetBytes(XMLString);
            return byteArray;
        }
    }
}

Agora no evento do botão salvar vou capturar os dados do formulário e utilizar o metodo SerializeObject passando para o mesmo o objeto do tipo USUARIO, preenchido com os dados do formulário.
O mentodo SerializeObject ira retornar o nome do arquivo xml que foi criado e disponibiliza-lo para download utilizando o comando Response.TransmitFile() e Response.End() para abrir o arquivo correto.
No evento do botão que captura o arquivo do componente FileUpload vou chamar o metodo DeserilizeObject que ira receber o componente FileUpload, abrir o arquivo xml, deserilizar e salvar os dados no objeto do tipo USUARIO.
Vou criar também um método para limpar os dados do formulário, por estética apenas, deixando o code-behind assim.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Net;

namespace XML_Serialize
{
    public partial class _Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            btnSalvar.Click += new EventHandler(btnSalvar_Click);
            btnCarregaArquivo.Click += new EventHandler(btnCarregaArquivo_Click);
        }
        void btnCarregaArquivo_Click(object sender, EventArgs e)
        {
            try
            {
                USUARIO user = new Ferramenta_serialize().DeserializeObject(fu_XML);
                txbNome.Text = user.NOME;
                rblSexo.SelectedValue = user.SEXO.ToString();
                txbDataNascimento.Text = user.DATA_NASCIMENTO.ToShortDateString();
                txbTelefone.Text = user.TELEFONE;

                fu_XML.Dispose();
            }
            catch(Exception ex) {
                lblMensage.Text = ex.Message;
            }
        }
        void btnSalvar_Click(object sender, EventArgs e)
        {
            try
            {
                USUARIO user = new USUARIO()
                {
                    NOME = txbNome.Text.Trim(),
                    SEXO = int.Parse(rblSexo.SelectedValue),
                    DATA_NASCIMENTO = DateTime.Parse(txbDataNascimento.Text.Trim()),
                    TELEFONE = txbTelefone.Text.Trim()
                };
                string rs = new Ferramenta_serialize().SerializeObject(user, Server.MapPath(string.Empty));
                Response.ContentType = "file/xml";
                Response.AppendHeader("Content-Disposition", "attachment; filename="+rs);
                Response.TransmitFile(rs);
                Response.End();
                limpaFormulario();

            }
            catch (Exception ex)
            {
                lblMensage.Text = ex.Message;
            }
        }
        private void limpaFormulario()
        {
            txbNome.Text = string.Empty;
            rblSexo.SelectedValue = null;
            txbDataNascimento.Text = string.Empty;
            txbTelefone.Text = string.Empty;
        }
    }
}
O retorno do nosso XML será algo do tipo;

Comments

Popular posts from this blog

Criando um filtro de busca customizável com JavaScript funcional

Tutoriais utilizando bibliotecas e frameworks para state management se tornaram comuns. Apesar disso, já que muita gente usa muitos frameworks diferentes, muitas vezes precisamos falar sobre a plataforma que permite isso tudo: a odiadíssima ferramenta que é o JavaScript, na sua forma mais pura — conforme descrito com documentações excelentes como a da MDN . Esse tutorial também pode ser útil para quem está iniciando em JavaScript e desenvolvimento em geral já começar com alguma ideia do que é programação funcional. O termo está se tornando popular e quem não subir nesse barco pode ficar para trás em pouco tempo. Não vamos adentrar nos detalhes do que é programação funcional neste artigo — isso é assunto para outras horas de conversa. Aqui, ficaremos no rápido e simples: alcançar nosso objetivo, evitando mutações dos dados e estado global. Iniciando o projeto Pelo bem da simplicidade, vamos manter tudo num único arquivo, que vai ter essa cara: <!DOCTYPE HTML> ...

Verificar sequencia de caracteres iguais em uma string c#

Neste post vamos ver como explorar uma string e verificar se existe uma seqüencia de caracteres iguais dentro da string. Utilizaremos a tabela ASCII para verificar letras e números, se você precisar verificar mais caracteres basta consultar a tabela e colocar o número referente na condição. Neste exemplo vou verificar se existe na string uma seqüencia quatro(4) números iguais e o mesmo para uma seqüencia de três(3) letras, pois acho que em números de documentos ou nomes isto não pode acontecer. Tabela de decimal ASCII public static bool ValidaTexto(this string txt) { bool flag = true; if (txt.Length < 3) { flag = false; } else { int contLetras = 0; int contNumeros = 0; int tmp = (int)txt.ToCharArray()[0]; foreach (char c in txt.ToCharArray()) { if (((int)c < 127 && (int)c >= 65)) { if (tmp == (int)c) { contLetras++; } if (contLetras >= 3) { break; } tmp = (int)c; } } //inicia novamente o armazenador tmp =...

Posts e consultas no twitter pelo windows phone 7 part 2 de 2

No artigo anterior ( Posts e consultas no twitter pelo windows phone 7 part 1 de 2 ) no vimos como construir uma aplicação no windows phone 7 que faça consultas no twitter utilizando o api do twitter; Neste artigo vamos tentar construir nesta mesma aplicação algo que o usuário possa fazer o login no twitter, visualize seus posts e adicione novos. No passo anterior no menu da aplicação nos deixamos um item chamado "login" que servira pra redirecionar para uma tela que o usuário possa efetuar o login no twiter; Para que essa parte da aplicação funcione  precisamos registrar nossa aplicação no twitter; Acesse dev.twitter.com . A aplicação deve ser to tipo Browser e a Callback URL informada, essa é uma das exigências do twitter, como nos vamos utilizar a URL do google( http://www.google.com ). Apos o registro da aplicação  o twitter retorna as url's necessárias para as transações. Para conseguirmos buscar e enviar informações no twitter vamos util...