2010-10-26 6 views
1

J'ai une classe capable de sérialiser et de désérialiser facilement après le chargement de mon application WPF. J'essaye maintenant d'ajouter dans la capacité de charger un projet au démarrage en passant dans le dossier de projet. Malheureusement, il jette un InvalidOperationException indiquant:Deserialize provoque InvalidOperationException lors du chargement au démarrage

There is an error in XML document (2, 2). ---> System.InvalidOperationException: <WeightingParametersBit xmlns=''> was not expected.

Le WeightingParametersBit est le type d'un membre de la classe, je suis en train de sérialisation. Il s'agit essentiellement d'un conteneur pour un dictionnaire. La chose étrange est, le fichier ne contient pas de balise pour <WeightingParametersBit xmlns=.... n'importe où dans le fichier. Une fois cette exception levée, l'application démarre. Si je clique sur le bouton de chargement et sélectionne le même fichier de projet, il se charge très bien.

Voici la classe que je suis en train de sérialisation (petite classe conteneur):

public class WeightSettings 
{ 
    public double UserScoreSlagging; 
    public double UserScoreFouling; 
    public WeightMode BitWeightMode = WeightMode.Manual; 
    public WeightMode LigWeightMode = WeightMode.Manual; 
    public WeightingParametersBit BitWeights = new WeightingParametersBit(); 
    public WeightingParametersLig LigWeights = new WeightingParametersLig(); 
} 

Et est le xml ici, il génère (coupé vers le bas pour des fins de visualisation):

<?xml version="1.0" encoding="utf-8"?> 
<WeightSettings> 
    <UserScoreSlagging>0</UserScoreSlagging> 
    <UserScoreFouling>0</UserScoreFouling> 
    <BitWeightMode>Manual</BitWeightMode> 
    <LigWeightMode>Manual</LigWeightMode> 
    <BitWeights> 
     <bituminous> 
      ... 
     </bituminous> 
    </BitWeights> 
    <LigWeights> 
     <lignitic> 
      ... 
     </lignitic> 
    </LigWeights> 
</WeightSettings> 

Mon générique Code sérialisation:

public static void Serialize<T>(this T source, TextWriter writer) 
{ 
    // Don't serialize a null object 
    if (Object.ReferenceEquals(source, null)) 
    { 
     throw new ArgumentException("Trying to serialize null object.", "source"); 
    } 

    XmlSerializer s = new XmlSerializer(typeof(T)); 
    s.Serialize(writer, source); 
    writer.WriteLine(); 
} 

Et désérialiser code:

public static T Deserialize<T>(this T source, TextReader reader) 
{ 
    XmlSerializer s = new XmlSerializer(typeof(T)); 
    source = (T)s.Deserialize(reader); 
    return source; 
} 

L'appel à Désérialise d'une propriété appelée WeightSettings (de type WeightSettings) qui est non nul:

WeightSettings = WeightSettings.Deserialize(sr);

Comment puis-je corriger ce comportement? Peut-être plus important encore: pourquoi est-ce que je vois ce comportement uniquement sur l'événement Window Loaded?

+0

Est-ce un espace de noms doivent être définis nulle part? – brumScouse

+1

Etes-vous sûr qu'il essaie réellement de charger le même fichier? –

+0

@brumScouse pas que je suis au courant. @Jon Skeet l'exécution est la même pendant l'événement de chargement et après; pour autant que je peux dire, c'est le même fichier – bradenb

Répondre

0

@Jon Skeet était sur la bonne voie. Je ne changeais pas le répertoire de travail en cours avant que mon application ne soit complètement chargée, donc il n'a pas pu trouver le fichier.

Très cryptique exception quand il aurait dû tout simplement été FileNotFoundException

Questions connexes