为什么 XmlSerializer 会抛出 InvalidOperationException 异常?

13
    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;
}

(提示:如果你有任何改进我的代码的建议,请随意分享,我是一个C#初学者)


你能把异常信息粘贴在这里吗? - Andrew Bezzub
1
请发布完整的异常信息,包括内部异常和相应的文档文本(即消息)。您真的错过了通常包含更多信息的消息。 - TomTom
4个回答

19

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

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


8
我的类型具有无参数的构造函数,但我仍然遇到了错误。原来问题的原因是一个公共属性具有 Uri 类型,而 Uri 类型没有无参数的构造函数。因此除了你的类型之外,在该类型中的公共属性也必须具有无参数的构造函数。 - user850010
当我捕获到这个异常并检查与之相关的几个InnerException级别时,我发现我的一个嵌套对象有一个成员,其类型是接口(IEnumerable),而且这个接口是不可序列化的。我想我必须将其转换为具体类型。 - Neek

6

哦..我不知道它还有额外的信息(必须点击“查看详情..”),谜团解决:

消息=SDB.DatabaseInformation无法序列化,因为它没有参数less构造函数。


1
我也遇到了这个异常,但并不是因为缺少默认构造函数。我有一些额外的属性(一个List和一个Dictionary),它们不是XML文档的一部分。将这些属性标记为[XmlIgnore]可以解决我的问题。

0
您可以通过提供调用重载构造函数的默认构造函数来解决这个问题。例如:
public DatabaseInformation() : this ("defaultName"){}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接