web-dev-qa-db-fra.com

C # XmlSerializer BindingFailure

Je reçois un BindingFailure sur une ligne de code à l'aide de XmlSerializer:

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

L'assembly avec le nom complet CustomXMLSerializeObject.XmlSerializers 'n'a pas pu être chargé dans le contexte de liaison' LoadFrom 'de l'AppDomain avec l'ID 1. L'échec était dû à: System.IO.FileNotFoundException: impossible de charger le fichier ou l'assembly XMLSerializeObject.XmlSerializers, Version = 1.4.0.0, Culture = neutre, PublicKeyToken = null 'ou l'une de ses dépendances. Le système ne peut pas trouver le fichier spécifié.

L'erreur est assez longue et continue en expliquant les informations d'état de pré-liaison et les endroits où elle a cherché pour essayer de trouver le fichier.

L'objet personnalisé que je tente de désérialiser est relativement simple: il s'agit simplement d'un ensemble d'entiers et de chaînes privés ayant des accesseurs publics. J'ai une variable privée qui est une autre classe sérialisable personnalisée, mais celle-ci n'a que des chaînes privées avec des accesseurs publics.

La partie maladroite? Cela ne se produit que lorsque je me désérialise. Cette ligne de code fonctionne correctement lorsque je sérialise l'objet. Cela fonctionne bien et l'objet est désérialisé et peuplé parfaitement. Ne remarquez aucune perte de performance ni un long temps de chargement.

En quoi consiste exactement cet avertissement (pas une erreur ni une exception, le programme fonctionne ensuite correctement)? Pourquoi ça se passe? Comment puis-je l'éviter sans simplement désactiver l'avertissement?

44
Steve H.

Selon Erreur étrange XmlSerializer

Cette exception fait partie de Fonctionnement normal de XmlSerializer. Il est prévu et sera attrapé et géré à l'intérieur du code-cadre . Ignorez-le et continuez. Si ça vous dérange pendant le débogage, définissez le Le débogueur Visual Studio ne doit s’arrêter que sur exceptions non gérées au lieu de toutes exceptions.

Cela est probablement dû aux exceptions que vous choisissez de surveiller.

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

Si vous décochez la case "Lancé" pour BindingFailure sous les assistants de débogage gérés, l'exception devrait disparaître. Ou si vous ne voulez pas faire cela, vous pouvez continuer car cette exception est intentionnelle

57
SwDevMan81

Utilisez la méthode suivante pour construire votre instance xmlSerializer afin de résoudre le problème:

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

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

39
Lin Song Yang

D'après MS VS 2010 Feedback , voici comment il a été conçu. Afin d'éviter cette exception et d'empêcher un ralentissement lors de l'exécution, vous devez générer un assembly de sérialiseur XML. 

J'ai pu trouver trois outils: Microsoft SGen , XGenPlus et Mvp.Xml.XGen . Malheureusement, aucune de ces informations n’a été mise à jour depuis 2007.

4
Lucas B

Bon j'ai trouvé une solution. Je n'ai jamais pu accepter d'éteindre les exceptions comme réponse. Semble juste en quelque sorte faux .... 

Ce qui semble se produire, c'est que dans les assemblées précédentes, ou dans les versions précédentes de votre assemblée actuelle, certaines références étaient utilisées en externe. Même si votre code a abandonné ces références depuis longtemps, les noms sont toujours, quelque part mystérieux, recherchés à l'Assemblée.

Accédez à vos fichiers AssemblyInfo.cs et recherchez 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 cette nature.

0
ouflak