2009-10-12 7 views
2

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:

alt text

Répondre

1

Brett,

Les versions ultérieures de .net va construire des ensembles de sérialiseur personnalisés. Cliquez sur Propriétés du projet -> Construire et recherchez "Générer les assemblages de sérialisation" et passez à Activé. Le désérialiseur XML utilisera ces assemblys qui sont personnalisés pour les classes de votre projet. Ils sont beaucoup plus rapides et demandent moins de ressources, car la réflexion n'est pas impliquée.

Je voudrais aller cette route de sorte que si vous changez la classe, vous ne devrez pas vous soucier des problèmes de sérialisation. La performance ne devrait pas être un problème.

0

Je vous recommande de ne pas preoptimize. Si votre code fonctionne, utilisez-le tel quel. Continuez à travailler sur du code qui n'est pas terminé ou qui ne fonctionne pas. Plus tard, si vous trouvez que vous avez un problème de performances dans ce domaine, vous pouvez explorer les performances.

Questions connexes