2010-03-23 5 views
8
public void Save() { 
      XmlSerializer Serializer = new XmlSerializer(typeof(DatabaseInformation)); 
      /* 
      A first chance exception of type 'System.IO.FileNotFoundException' occurred in mscorlib.dll 
      A first chance exception of type 'System.IO.FileNotFoundException' occurred in mscorlib.dll 
      A first chance exception of type 'System.InvalidOperationException' occurred in System.Xml.dll 
      */ 

      // .... 
    } 

Ceci est la classe si vous en avez besoin:Pourquoi XmlSerializer lève une exception InvalidOperationException?

public class DatabaseInformation 
{ 
    /* Create new database */ 
    public DatabaseInformation(string name) { 
     mName = name; 
     NeedsSaving = true; 
     mFieldsInfo = new List<DatabaseField>(); 
    } 

    /* Read from file */ 
    public static DatabaseInformation DeserializeFromFile(string xml_file_path) 
    { 
    XmlSerializer Serializer = new XmlSerializer(typeof(DatabaseInformation)); 
     TextReader r = new StreamReader(xml_file_path); 
     DatabaseInformation ret = (DatabaseInformation)Serializer.Deserialize(r); 
     r.Close(); 
     ret.NeedsSaving = false; 
     return ret; 
    } 

    /* Save */ 
    public void Save() { 
    XmlSerializer Serializer = new XmlSerializer(typeof(DatabaseInformation)); 
     if (!mNeedsSaving) 
      return; 

     TextWriter w = new StreamWriter(Path.Combine(Program.MainView.CommonDirectory.Get(), Name + ".xml"), false); 
     Serializer.Serialize(w, this); 
     w.Close(); 
     NeedsSaving = false; 
    } 

    private string mName; 
    public string Name { get { return mName; } } 

    private bool mNeedsSaving; 
    public bool NeedsSaving { get { return mNeedsSaving; } set { mNeedsSaving = value; Program.MainView.UpdateTitle(value); } } 

    private bool mHasId; 
    public bool HasId { get { return mHasId; } } 

    List<DatabaseField> mFieldsInfo; 
} 

(PS: si vous avez des conseils pour améliorer mon code ne hésitez pas à partager, je suis un débutant C#)

+0

Pourriez-vous coller des messages d'exception ici? –

+1

Veuillez publier des informations d'exception complètes, y compris les exceptions internes - et les textes de documentation correspondants (par exemple, message). Vous manquez vraiment le message qui contient souvent plus d'informations. – TomTom

Répondre

13

Pour sérialiser/désérialiser votre type, il doit avoir un constructeur sans paramètre. Consultez here:

Une classe doit avoir un constructeur par défaut à sérialisé par XmlSerializer.

+6

Mon type a un constructeur sans paramètre et j'ai toujours cette erreur. Il s'avère que la cause était une propriété publique de type Uri qui n'a pas de constructeur sans paramètre. Donc, en plus de votre type, vos propriétés publiques dans ce type doivent également avoir un constructeur sans paramètre. – user850010

+0

sauvé ma journée !!! – Leviathan

+0

Lorsque j'ai intercepté cette exception et examiné plusieurs niveaux d'InnerException associés, j'ai trouvé qu'un de mes objets imbriqués avait un membre dont le type est une interface (IEnumerable) et qui n'est pas sérialisable. Je suppose que je vais devoir convertir cela en un type concret. – Neek

6

oh .. Je ne savais pas qu'il avait des informations supplémentaires (dû cliquez sur "Voir les détails .."), mystère résolu:

message = SDB.DatabaseInformation ne peut pas être sérialisé parce qu'il n'a pas un constructeur sans paramètre.

0

Vous pouvez contourner ce problème en fournissant un constructeur par défaut qui appelle le constructeur surchargé. Par exemple:

public DatabaseInformation() : this ("defaultName"){} 
1

J'ai également reçu cette exception, mais ce n'était pas dû à l'absence d'un constructeur par défaut. J'ai eu quelques propriétés supplémentaires (List et Dictionary) qui ne font pas partie du document XML.

Décorer ces propriétés avec [XmlIgnore] a résolu le problème pour moi.

Questions connexes