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 
      */ 

      // .... 
    } 

Это весь класс, если вам это нужно:Почему XmlSerializer выбрасывает 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: если у вас есть какие-либо советы, чтобы улучшить свой код, не стесняйтесь делиться, я новичок в C#)

+0

Не могли бы вы здесь вставить сообщения об исключениях? –

+1

Пожалуйста, напишите полную информацию об исключениях, включая внутренние исключения, и соответствующие тексты документации (то есть сообщение). Вы действительно пропускаете сообщение, которое часто содержит больше информации. – TomTom

ответ

13

Чтобы сериализовать/десериализовать ваш тип, он должен иметь конструктор без параметров. Проверьте here:

Класс должен иметь конструктор по умолчанию для сериализации с помощью XmlSerializer.

+6

У моего типа нет конструктора без параметров, и я до сих пор получил эту ошибку. Оказывается, причиной была публичная собственность с типом Uri, у которой нет конструктора без параметров. Итак, помимо вашего типа, ваши общедоступные свойства в этом типе также должны иметь конструктор без параметров. – user850010

+0

спас мой день !!! – Leviathan

+0

Когда я поймал это исключение и изучил несколько уровней связанного с ним InnerException, я обнаружил, что один из моих вложенных объектов имеет член, тип которого является интерфейсом (IEnumerable), и это не сериализуемо. Думаю, мне придется преобразовать это в конкретный тип. – Neek

6

ой .. я не знаю, что имел дополнительную информацию (было нажать «Посмотреть подробности ..»), тайна решена:

Message = SDB.DatabaseInformation не может сериализовать потому, что он не имеет безпараметрический конструктор.

0

Вы можете обойти это, предоставив конструктор по умолчанию, который вызывает перегруженный конструктор. Например:

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

Я также получаю это исключение, но это не было из-за отсутствия конструктора по умолчанию. У меня были некоторые дополнительные свойства (a List и Dictionary), которые не являются частью документа XML.

Отделка этих объектов [XmlIgnore] решила проблему для меня.

Смежные вопросы