为什么XmlSerializer会抛出InvalidOperationException?

时间:2010-03-23 07:31:15

标签: c# .net exception invalidoperationexception

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

          // ....
     }

如果你需要,这是全班:

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#初学者)

4 个答案:

答案 0 :(得分:15)

要序列化/反序列化您的类型,它需要具有无参数构造函数。查看here

  

一个类必须有一个要序列化的默认构造函数   XmlSerializer的。

答案 1 :(得分:6)

哦..我不知道它有其他信息(不得不点击“查看详细信息......”),神秘解决了:

  

Message = SDB.DatabaseInformation不能   被序列化,因为它没有   无参数构造函数。

答案 2 :(得分:1)

我也得到了这个异常,但这不是因为缺少默认构造函数。我有一些额外的属性(ListDictionary),它们不属于XML文档。

使用[XmlIgnore]装饰这些属性为我解决了这个问题。

答案 3 :(得分:0)

你可以通过提供一个调用重载构造函数的默认构造函数来解决这个问题。例如:

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