2010-03-23 3 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 
      */ 

      // .... 
    } 

Questa è tutta la classe, se ne avete bisogno:Perché XmlSerializer genera un'eccezione 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: se avete dei suggerimenti per migliorare il mio codice sentitevi liberi di condividere, io sono un principiante C#)

+0

Potresti incollare qui messaggi di eccezione? –

+1

Si prega di inviare informazioni complete sulle eccezioni, incluse le eccezioni interne - e i testi di documentazione corrispondenti (cioè messaggio). Ti manca davvero il messaggio che spesso contiene più informazioni. – TomTom

risposta

13

Per serializzare/deserializzare il tuo tipo è necessario avere un costruttore senza parametri. Partenza here:

Una classe deve avere un costruttore di default per essere serializzato dal XmlSerializer.

+6

Il mio tipo ha costruttore senza parametri e ho ancora ricevuto questo errore. Si scopre che la causa era una proprietà pubblica con tipo Uri che non ha un costruttore senza parametri. Quindi oltre al tuo tipo, anche le tue proprietà pubbliche in quel tipo devono avere anche il costruttore senza parametri. – user850010

+0

mi ha salvato la giornata !!! – Leviathan

+0

Quando ho rilevato questa eccezione ed ho esaminato diversi livelli di InnerException associati, ho trovato uno dei miei oggetti nidificati con un membro il cui tipo è un'interfaccia (IEnumerable) e questo non è serializzabile. Credo che dovrò convertirlo in un tipo concreto. – Neek

6

oh .. non sapevo avesse informazioni aggiuntive (dovuto cliccare su "Visualizza dettaglio .."), mistero risolto:

Messaggio = SDB.DatabaseInformation non può essere serializzato perché non ha un costruttore senza parametri.

0

È possibile aggirare questo fornendo un costruttore predefinito che chiama il costruttore sovraccarico. Ad esempio:

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

Stavo ricevendo anche questa eccezione, ma non era dovuta alla mancanza di un costruttore predefinito. Avevo alcune proprietà extra (a List e Dictionary) che non fanno parte del documento XML.

La decorazione di queste proprietà con [XmlIgnore] ha risolto il problema per me.