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: ASP.Net, C#, cSharp, linq, List, LoadXml, serialização, SharePoint, ToList, VB.Net, XML, XmlAttribute, XmlSerializer