Je travaille avec un schéma xml compliqué, pour lequel j'ai créé une structure de classe en utilisant xsd.exe (avec quelques efforts). Je peux maintenant désérialiser de manière fiable le xml dans la structure de classe générée. Par exemple, considérons le code XML suivant à partir du service Web:Efficacité de la désérialisation par rapport à XmlReader
<ODM FileType="Snapshot" CreationDateTime="2009-10-09T19:58:46.5967434Z" ODMVersion="1.3.0" SourceSystem="XXX" SourceSystemVersion="999">
<Study OID="2">
<GlobalVariables>
<StudyName>Test1</StudyName>
<StudyDescription/>
<ProtocolName>Test0001</ProtocolName>
</GlobalVariables>
<MetaDataVersion OID="1" Name="Base Version" Description=""/>
<MetaDataVersion OID="2" Name="Test0001" Description=""/>
<MetaDataVersion OID="3" Name="Test0002" Description=""/>
</Study>
</ODM>
je peux désérialiser le XML comme suit:
public ODMcomplexTypeDefinitionStudy GetStudy(string studyId)
{
ODMcomplexTypeDefinitionStudy study = null;
ODM odm = Deserialize<ODM>(Service.GetStudy(studyId));
if (odm.Study.Length > 0)
study = odm.Study[0];
return study;
}
Service.GetStudy() retourne un flux HTTPResponse du service Web. Et Deserialize() est une méthode auxiliaire qui désérialise le flux dans le type d'objet T.
Ma question est la suivante: est-il plus efficace de laisser le processus de désérialisation créer toute la structure de la classe et de désérialiser le xml, ou est-ce plus efficace pour saisir seulement le xml d'intérêt et désérialiser ce xml. Par exemple, je pourrais remplacer le code ci-dessus:
public ODMcomplexTypeDefinitionStudy GetStudy(string studyId)
{
ODMcomplexTypeDefinitionStudy study = null;
using (XmlReader reader = XmlReader.Create(Service.GetStudy(studyId)))
{
XDocument xdoc = XDocument.Load(reader);
XNamespace odmns = xdoc.Root.Name.Namespace;
XElement elStudy = xdoc.Root.Element(odmns + "Study");
study = Deserialize<ODMcomplexTypeDefinitionStudy>(elStudy.ToString());
}
return study;
}
Je soupçonne que la première approche est préférable - il y a beaucoup de manipulation dom passe dans le second exemple, et le processus de désérialisation doit avoir des optimisations; Cependant, que se passe-t-il lorsque le XML se développe de façon spectaculaire? Supposons que la source renvoie 1 Mo de xml et que je ne m'intéresse vraiment qu'à un très petit composant de ce xml. Devrais-je laisser le processus de désérialisation remplir la classe ODM contenant tous ses tableaux et propriétés des nœuds enfants? Ou tout simplement aller chercher le noeud enfant comme dans le second exemple !! ??
Je ne sais pas ce qui aide, mais voici une image sommaire du dilemme: