2010-05-10 10 views
7

J'ai un site Web qui jette OutOfMemoryExceptions sur chaque fois qu'il arrive à l'endroit suivant dans mon code:.NET OutOfMemoryException sur XMLSerializer.Serialize

XmlSerializer xs = new XmlSerializer(t, xoverrides); 

En voyant comment cela ne se produit quand il est sur le serveur Web , je n'ai pas une tonne d'informations sur pourquoi cela se passe. Je sais que les objets qu'il sérialise ne sont rien de trop sérieux - nettement moins d'un Mo chacun.

Avez-vous déjà mangé avec ça? Envie de m'aider à diagnostiquer le problème? Toute aide est appréciée.

Merci!

Répondre

9

L'exception OutOfMemoryException n'est pas provoquée par les objets en cours de sérialisation, mais résulte plutôt de la construction des objets XmlSerializer. Lorsqu'un XmlSerializer est créé, un assembly est généré dynamiquement et chargé dans AppDomain. Ces assemblys ne peuvent pas être récupérés avant que leur AppDomain ne soit déchargé, ce qui n'est jamais le cas dans votre cas. Selon le constructeur XmlSerializer utilisé, chaque XmlSerializer construit générera dynamiquement un nouvel assembly. Avec le temps, ces assemblages consommeront toute la mémoire disponible.

Il y a deux solutions:

  1. Cache XmlSerializer que vous créez.
  2. Utilisez l'une des surcharges du constructeur XmlSerializer qui implémente la mise en cache. Il semble que vous utilisez XmlSerializer (Type, XmlAttributeOverrides) qui n'implémente pas la mise en cache. XmlSerializer (Type) et XmlSerializer (Type, chaîne) implémentent la mise en cache.

Microsoft KB : Memory usage is high when you create several XmlSerializer objects in ASP.NET

+0

Salut, je suis confronté à la même question alors que je suis en utilisant "nouvelle XmlSerializer (o.GetType());". Je suis confronté à ce problème sur ma machine locale avec de très grandes données sérialisées, il ne donne aucune exception sur l'application en direct, qui est hébergé sur un serveur cloud. Mais je suis incapable d'utiliser et de tester la chaîne sérialisée plus loin pendant le développement. Je suis ouvert aux suggestions. –

0

Si je me souviens de problèmes similaires tout à l'heure, le XmlSerializer a besoin d'une tonne de mémoire de plus que les données de son traitement. Je ne suis pas sûr pourquoi c'est le cas cependant.