Pessoal,

Recentemente me deparei com um problema de performance. Precisava ler uma lista do SharePoint e em seguida gerar um XML para o desenvolvimento de um WebService que seria consumido por uma aplicação em Flash. A primeira alternativa foi fazer um loop e gerar o XML manualmente e retornar uma variável do tipo XmlDocument e pronto. Funcionou perfeitamente mas tive problemas de performance.. Os códigos deste post estão em C# e podem facilmente ser portados para VB.Net (que eu não curto muito!)

 

Conversando com o pessoal em volta surgiu a idéia de serialização. Como eu não tinha feito nada no sentido me bati um pouco. Mas deu certo e o que demorava 30 segundos para 600 registros passou a ser feito em 1 segundo para 1200 :)

O arquivo XML gerado deveria ter a estrutura abaixo:


   
      Uma mensagem qualquer
   

Abaixo temos a definição da classe que será serializada e utilizada para a geração do XML

        [XmlRoot("data")]
        public class tip
        {
            [XmlAttribute("size")]
            public string Size { get; set; }

            [XmlAttribute("name")]
            public string Name { get; set; }

            [XmlText]
            public string Mensagem { get; set; }

            [XmlAttribute("image")]
            public string Image { get; set; }

            [XmlAttribute("time")]
            public string Time { get; set; }

            public List Itens { get; set; }
        }

Percebam que na classe acima utilizei em algumas propriedades o marcador [XmlAttribute("size")] com isso informei ao FrameWork que na renderização do XML a propriedade seja uma propriedade da TAG TIP (o nome da classe) caso contrário ela seria uma tag e o código gerado seria semelhante ao lista abaixo:


   
      1
      Anderson Caetano Pilatti
      http://graph.facebook.com/100002065697632/picture
      anderson.pilatti
      
      Uma mensagem qualquer
   

Outro ponto importante: Com não queria a TAG Mensagem usei o marcador [XmlText] com isso seu conteúdo foi gerado sem marcação sendo considerado dado da TAG

Com a classe pronta, podemos agora fazer uma consulta linq e definir o tipo que sera carregado, com isso deixamos o retorno tipado (com a classe que definimos anteriormente)

List oResult = (from l in oData.AsEnumerable()
                select new tip
                {
                    Name = l.Field("Title"),
                    Image = l.Field("Imagem"),
                    Size = l.Field("Area"),
                    Mensagem = l.Field("Mensagem"),
                    Time = l.Field("Tempo"),
                }).ToList();

Para serializar o retorno usaremos o código abaixo:

XmlSerializer serializer = new XmlSerializer(typeof(List), new XmlRootAttribute("data"));
XmlWriterSettings settings = new XmlWriterSettings();

settings.Encoding = new UnicodeEncoding(false, false);
settings.Indent = false;
settings.OmitXmlDeclaration = false;

using (StringWriter textWriter = new StringWriter())
{
   using (XmlWriter xmlWriter = XmlWriter.Create(textWriter, settings))
   {
      serializer.Serialize(xmlWriter, oResult);
   }

   xmlDoc.LoadXml(textWriter.ToString());
}

Esse código me ajudou muito, como foi um pouco complicado de achar a solução resolvi compartilhar..

Espero que sirva para mais alguém.

Abs

Tags: , , , , , , , , , , , ,

Deixe um comentário

Você pode usar estas TAG´s: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>