407 votes

XmlSerializer donnant FileNotFoundException au constructeur

Une application avec que j’ai travaillé est tombe en panne lorsque j’essaie de sérialiser les types.

Une telle affirmation

produit :

Je ne définis pas les sérialiseurs spéciaux pour ma classe.

Comment puis-je résoudre ce problème ?

461voto

Martin Sherburn Points 1897

Croyez le ou non, ce comportement est normal. Une exception est levée, mais géré par le XmlSerializer, donc si vous ignorez tout devrait continuer à bien.

J'ai trouvé cela très souvent embêtant, et il ya eu de nombreuses plaintes à ce sujet si vous recherchez un peu autour de lui, mais de ce que j'ai lu de Microsoft n'a pas l'intention de faire quoi que ce soit.

Vous pouvez éviter de tomber Exception popups tout le temps pendant le débogage si vous éteignez d'abord chance exceptions à cette exception. Dans Visual Studio, aller à Déboguer -> Exceptions (ou appuyez sur Ctrl + Alt + E), Common Language Runtime Exceptions -> Système.IO -> Système.IO.FileNotFoundException.

Vous pouvez trouver des informations sur un autre moyen de contourner cela dans le blog de C# XmlSerializer FileNotFound exception (Chris Vend de " l'outil de XmlSerializerPreCompiler).

117voto

Allon Guralnek Points 8545

À l'instar de Martin Sherburn dit, ce comportement est normal. Le constructeur de la XmlSerializer essaie d'abord de trouver un assembly nommé [YourAssembly].XmlSerializers.dll qui devrait contenir la classe générée pour la sérialisation de votre type. Depuis une DLL n'a pas été générée encore (ils ne sont pas par défaut), un FileNotFoundException est levée. Lorsque que happenes, XmlSerializer constructeur de captures que l'exception, et la DLL est généré automatiquement lors de l'exécution par le XmlSerializer du constructeur (ce qui est fait en générant des fichiers source C# dans le répertoire %temp% de votre ordinateur, puis de les compiler en utilisant le compilateur C#). Constructions annexes d'un XmlSerializer pour le même type utilisera simplement le déjà DLL générée.

Mise à JOUR: à partir de .NET 4.5, XmlSerializer n'exécute plus la génération de code ni effectuer la compilation avec le compilateur C# afin de créer un sérialiseur de l'assemblée au moment de l'exécution, sauf s'il est explicitement forcé par la fixation d'un fichier de configuration de paramètre (useLegacySerializerGeneration). Cette modification supprime la dépendance à l'égard csc.exe et améliore les performances de démarrage. Source: .NET Framework 4.5 Readme, section 1.3.8.1.

L'exception est gérée par XmlSerializer du constructeur. Il n'est pas nécessaire de tout faire vous-même, vous pouvez simplement cliquez sur "Continuer" (F5) pour poursuivre l'exécution de votre programme et tout ira bien. Si vous êtes gêné par les exceptions de l'arrêt de l'exécution de votre programme et de sauter jusqu'à une exception helper, vous avez "Juste Mon Code" éteint, ou si vous avez le FileNotFoundException séance d'exécution lors de la levée, au lieu de quand 'non'.

Pour activer l'option " Juste Mon Code, allez dans Outils >> Options >> Débogage >> Général >> Activer uniquement Mon Code. Pour désactiver la rupture de l'exécution lorsqu'FileNotFound est levée, aller à Déboguer >> Exceptions >> Trouver >> entrez "FileNotFoundException' >> décocher la 'Levée' case à cocher à partir du Système.IO.FileNotFoundException.

72voto

VladV Points 5071

Propriétés (page « Construire », si je me souviens qu’il est bon) du projet dans Visual Studio il y a une option disant « générer l’assembly de sérialisation ». Essayez de mettre en marche pour un projet qui génère [Contenant l’Assembly de MyType].

67voto

quadfinity Points 405

Il existe une solution pour cela. Si vous utilisez

elle devrait éviter cette exception. Cela a fonctionné pour moi.

8voto

Ami Bar Points 61

Pour éviter l'exception que vous devez faire deux choses:

  1. Ajouter un attribut à la classe sérialisée (j'espère que vous y avez accès)
  2. Générer la sérialisation fichier avec sgen.exe

Ajouter le Système.Xml.La sérialisation.XmlSerializerAssembly attribut de ta classe. Remplacer "MyAssembly" avec le nom de l'assemblée, où MyClass.

[Serializable]
[XmlSerializerAssembly("MyAssembly.XmlSerializers")]
public class MyClass
{
…
}

Générer le fichier en utilisant la sérialisation sgen.exe l'utilitaire et le déployer avec la classe de l'assemblée.

‘sgen.exe MyAssembly.dll' va générer le fichier MyAssembly.XmlSerializers.dll

Ces deux changements feront l' .net pour savoir directement à l'assemblée. J'ai vérifié et il fonctionne sur .NET framework 3.5 avec Visual Studio 2008

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X