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

Vue.js, React.js ou angular. O que escolher?

As estruturas JavaScript estão se desenvolvendo em um ritmo extremamente rápido, o que significa que hoje temos versões atualizadas frequentemente do Angular, ReactJS e de outro player neste mercado - Vue.js. Analisando o número de posições abertas em todo o mundo que exigem um conhecimento específico de um determinado framework. Como fonte, Indeed.com  chegando a seguinte distribuição de acordo com mais de 60.000 ofertas de emprego. Levando em conta os dados a seguir, será apresentado as principais vantagens e desvantagens de cada framework frontend para ajudar os profissionais de tecnologia ou engenheiros a escolher o melhor para suas necessidades de desenvolvimento. Prós e contras do angular Angular é uma estrutura de MVVM super-heróica de JavaScript, fundada em 2009, que é incrível para a criação de aplicativos da Web altamente interativos. Benefícios do Angular  Novos recursos como RXJS aprimorado, compilação mais rápida (em menos de 3 segundos),...

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> ...

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...