2010-08-18 6 views
9

J'ai le code suivant:Pourquoi une erreur de sérialisation se produit-elle?

class Program 
{ 
    static void Main(string[] args) 
    { 
     string xml = @"<ArrayOfUserSetting> 
          <UserSetting> 
           <Value>Proposals</Value> 
           <Name>LastGroup</Name> 
          </UserSetting> 
          <UserSetting> 
           <Value>Visible</Value> 
           <Name>WidgetsVisibility</Name> 
          </UserSetting> 
         </ArrayOfUserSetting>"; 

     List<UserSetting> settings = 
       GetObjFromXmlDocument<List<UserSetting>>(xml); 
    } 

    public static T GetObjFromXmlDocument<T>(string xml) 
    { 
     T customType; 

     XmlSerializer serializer = new XmlSerializer(typeof(T)); 

     XmlDocument xmlDocument = new XmlDocument(); 
     xmlDocument.LoadXml(xml); 
     using (XmlNodeReader xmlNodeReader = new XmlNodeReader(xmlDocument)) 
     { 
      customType = (T)serializer.Deserialize(xmlNodeReader); 
     } 

     return customType; 
    } 
} 

[Serializable] 
public class UserSetting 
{ 
    public string Value { get; set; } 
    public string Name { get; set; } 
} 

Le code fonctionne très bien et l'appel à une collection GetObjFromXmlDocument cède la liste. Cependant, je reçois toujours une exception de première chance de type System.IO.FileNotFoundException dans mscorlib.dll, lorsque XmlSerializer serializer = new XmlSerializer(typeof(T)); est exécutée. Je suis donc passé en Debug/Exception et j'ai activé les Assistants de mise au point gérés. Je suis arrivé ce qui suit sur cette ligne:

L'assemblage avec « mscorlib.XmlSerializers » nom d'affichage a échoué à charger dans le contexte de liaison « LoadFrom » du AppDomain avec ID 1. La cause de l'échec a été: système. IO.FileNotFoundException: Impossible de charger le fichier ou l'assembly 'mscorlib.XmlSerializers, Version = 2.0.0.0, Culture = neutre, PublicKeyToken = b77a5c561934e089' ou l'une de ses dépendances. Le système ne peut pas trouver le fichier spécifié. Nom du fichier: 'mscorlib.XmlSerializers, Version = 2.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089'

Quelqu'un peut-il expliquer pourquoi cela se passe? Y at-il quelque chose que je pourrais faire à la classe UserSetting pour faire disparaître le problème? L'application est assez sensible aux performances et je préfère ne pas avoir l'exception.

Répondre

10

Microsoft says:

XmlSerializer tente de charger serializers pré généré pour éviter compilation du code de sérialisation à la volée. Il n'y a pas de moyen facile de vérifier que "l'assemblage sera trouvé par l'appel Assembly.Load()", ce serait dupliquer la recherche de chemin de fusion et la logique de chargeur dans XmlSerializer.

Il ressemble à une exception FileNotFound est jeté et manipulée dans XmlSerializer lorsque la « prégénérée sérialiseur » ne peut pas être trouvé, ce qui entraîne ensuite le code de sérialisation à générer.

+2

Merci, c'est très utile! Plus d'informations sur le problème, si vous voyez cela pendant le débogage, appuyez simplement sur F5 et votre programme continuera (il ne tombera pas en panne ... au moins pas b/c de cela). –

2

Pour les quelques projets Visual Studio j'ai où cela est une gêne, je préfère désactiver pause en cas d'exception pour seulement la BindingFailure et la System.IO.FileNotFoundException.

Dans Visual Studio: ctrl-D, E-Ctl pour la boîte de dialogue Exceptions:

1) Décocher BindingFailure sous gérés Assistants Débogage

2) Décocher System.IO.FileNotFoundException sous Common Language Exceptions d'exécution.

Ahhh c'est mieux :-)

Questions connexes