【问题标题】:Why is XmlSerializer throwing an InvalidOperationException?为什么 XmlSerializer 会抛出 InvalidOperationException?
【发布时间】:2010-03-23 07:31:14
【问题描述】:
    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# 初学者)

【问题讨论】:

  • 您能在此处粘贴异常消息吗?
  • 请发布完整的异常信息,包括内部异常 - 以及相应的文档文本(即消息)。您真的很想念通常包含更多信息的消息。

标签: c# .net exception invalidoperationexception


【解决方案1】:

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

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

【讨论】:

  • 我的类型有无参数构造函数,我仍然得到这个错误。事实证明,原因是 Uri 类型的公共属性没有无参数构造函数。因此,除了您的类型之外,您在该类型中的公共属性也必须具有无参数构造函数。
  • 当我捕捉到这个异常并检查了与其关联的多个级别的 InnerException 时,我发现我的一个嵌套对象有一个类型为接口 (IEnumerable) 的成员,并且这是不可序列化的。我想我必须将其转换为具体类型。
【解决方案2】:

哦..我不知道它有其他信息(必须点击“查看详细信息..”),谜团解开了:

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-20
        • 2011-01-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多