2009-10-19 8 views
1

Je reçois des données de services Web en XML et j'utilise ces données via des objets, en fonction du XML reçu. Ainsi, parfois j'ai besoin de stocker de tels objets spécifiques à l'utilisateur entre les demandes en session. Je sais que XMLDocument ne pouvait pas être stocké explicitement (serveur d'état) ... donc je fais une construction comme terribles:Comment conserver les objets XML de session?

private string _data; 
public XmlDocument Data 
{ 
    get 
    { 
     XmlDocument res = new XmlDocument(); 
     if (!string.IsNullOrEmpty(_data)) 
     { 
      res.InnerXml = _data; 
      return res; 
     } 
     return null; 
    } 
    set { _data = value.InnerXml; } 
} 

donc je suis stocker implicitement xml ... utile pour moi au cours du développement , parce que je ne sais pas exactement quelles propriétés j'ai besoin de l'objet entier - je peux faire des propriétés expérimentales simples avec xpath etc dans un pincement ...

ainsi il est confortable pour moi, mais il semble très inefficace de construire xmldocument de chaîne chaque fois que j'ai besoin d'obtenir des données de n'importe quelle propriété de cette classe. Y a-t-il un moyen de contourner?) Merci.

+0

Pourquoi un XMLDocument ne peut-il pas être stocké dans Session de manière explicite? Si c'est grand, ce ne serait pas une bonne idée, mais ce ne serait pas non plus une bonne idée de le stocker en tant que chaîne. –

+0

J'ai oublié de mentionner que j'utilise le serveur d'état ... donc je ne peux pas mettre XMLDocument là. Oui, ce n'est pas un moyen efficace de stocker ... mais il y a quelques avantages clés pour moi) –

Répondre

2

Si vous avez besoin de stocker des données à travers les requêtes, il n'y a vraiment pas moyen de sérialiser et de dé-sérialiser les données lors de chaque requête - à une exception près. Si vous utilisez des sessions in-process, il est possible de stocker tout objet de votre choix, y compris les objets XMLDocument ou même (pardonnez-moi pour ne serait-ce qu'en le mentionnant) les handles de fichiers ouverts et les connexions à la base de données. Je ne recommanderais pas de rendre votre application dépendante des sessions en cours, car cela éliminerait la possibilité de placer l'application dans une ferme Web si cela devenait nécessaire. Je pense que votre meilleure option est d'optimiser votre stratégie actuelle. Assurez-vous que XMLDocument n'est reconstruit qu'une seule fois lors de chaque requête? Au lieu de construire un XMLDocument, il serait peut-être plus efficace d'utiliser un XMLReader, en fonction de l'utilisation réelle des données XML.

+0

Oui ... peut-être une optimisation) Mais XMLReader n'est pas si facile à utiliser) Je préfère les extractions faciles avec xpath ou linq. .. donc j'ai besoin de XMLDocument ou XDocument. Le problème est exactement - XMLDocument construit chaque fois que je reçois une propriété de la classe ... et je ne peux pas stocker de document construit dans la variable de classe car la classe deviendra immédiatement non sérialisable) –

+0

Si vous utilisez BinaryFormatter ou SoapFormatter pour sérialiser l'objet, puis mettre l'attribut @NonSerialized sur un membre empêchera .Net d'essayer de sérialiser ce membre. – jthg

Questions connexes