52 votes

C# XmlSerializer BindingFailure (échec de liaison)

J'obtiens un BindingFailure sur une ligne de code utilisant le XmlSerializer :

XmlSerializer s = new XmlSerializer(typeof(CustomXMLSerializeObject));

L'assemblage avec le nom d'affichage 'CustomXMLSerializeObject.XmlSerializers' n'a pas réussi à se charger dans le contexte de liaison 'LoadFrom' de l'AppDomain avec ID 1. La cause de l'échec est la suivante System.IO.FileNotFoundException : Could not load file or assembly XMLSerializeObject.XmlSerializers, Version=1.4.0.0, Culture=neutral, PublicKeyToken=null' ou l'une de ses dépendances. Le système ne trouve pas le fichier spécifié.

Le message d'erreur est assez long et explique les informations relatives à l'état avant la liaison et les endroits où il a cherché à trouver le fichier.

L'objet personnalisé que j'essaie de déprogrammer est relativement simple - juste un groupe d'entiers et de chaînes privés qui ont des accesseurs publics. J'ai bien une variable privée qui est une autre classe sérialisable personnalisée, mais elle ne contient que des chaînes privées avec des accesseurs publics.

La partie gênante ? Cela ne se produit que lorsque je désérialise. Cette ligne de code fonctionne bien lorsque je sérialise l'objet. Elle fonctionne bien et l'objet est désérialisé et peuplé parfaitement. Je ne remarque pas vraiment de perte de performance ou de temps de chargement long.

Quel est exactement cet avertissement (qui n'est pas une erreur ou une exception, le programme s'exécute bien ensuite) ? Pourquoi se produit-il ? Comment puis-je l'empêcher sans simplement désactiver l'avertissement ?

70voto

SwDevMan81 Points 22634

Selon Erreur étrange de XmlSerializer :

Cette exception fait partie du fonctionnement normal de fonctionnement normal de XmlSerializer. Elle est attendue et sera attrapée et et traitée dans le code du Framework. Ignorez-la et continuez. Si cela vous dérange pendant le débogage, paramétrez le débogueur de débogueur de Visual Studio pour qu'il ne s'arrête que sur exceptions non gérées au lieu de toutes les exceptions.

Elle est probablement causée par les exceptions que vous choisissez de surveiller.

Pouvez-vous me dire comment sont configurées vos exceptions : Debug -> Exceptions

Si vous décochez la case "Thrown" pour BindingFailure dans les Managed Debugging Assistants, l'exception devrait disparaître. Ou si vous ne voulez pas faire cela, vous pouvez simplement continuer puisque cette exception a été conçue à dessein.

44voto

Goby Points 364

L'utilisation de la méthode suivante pour construire votre instance xmlSerializer résoudra le problème :

XmlSerializer s = XmlSerializer.FromTypes(new[] { typeof(CustomXMLSerializeObject) })[0];

alors, vous n'avez pas besoin de désactiver les traitements d'exception.

4voto

Lucas B Points 3441

Selon Commentaires sur MS VS 2010 c'est ainsi qu'il a été conçu. Afin d'éviter cette exception et de prévenir un ralentissement lors de l'exécution, vous devez générer un assemblage Serializer XML.

Il y a trois outils que j'ai pu trouver : Microsoft SGen , XGenPlus et Mvp.Xml.XGen . Au moment de la rédaction de cet article, malheureusement, aucun d'entre eux n'a été mis à jour depuis 2007.

0voto

ouflak Points 1206

Bon, j'ai trouvé une solution. Je n'ai jamais pu accepter de désactiver les exceptions comme une réponse. Ça me semble tout simplement incorrect....

Ce qui semble se passer, c'est que dans les assemblages précédents, ou dans les versions précédentes de votre assemblage actuel, certaines références étaient utilisées en externe. Même si votre code a depuis longtemps abandonné ces références, les noms sont toujours, quelque part mystérieusement, recherchés dans l'assemblage.

Allez dans vos fichiers AssemblyInfo.cs et trouvez ThemeInfo :

[assembly: ThemeInfo(
ResourceDictionaryLocation.ExternalAssembly, //where theme specific resource dictionaries are located
//(used if a resource is not found in the page, 
// or application resource dictionaries)
ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located
//(used if a resource is not found in the page, 
// app, or any theme specific resource dictionaries))]

Changez le premier emplacement en "Aucun" :

[assembly: ThemeInfo(
ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located
//(used if a resource is not found in the page, 
// or application resource dictionaries)
ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located
//(used if a resource is not found in the page, 
// app, or any theme specific resource dictionaries))]

Et gardez vos exceptions allumées ! Je posterai cette réponse à diverses questions de même nature.

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