11
    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#の初心者です)

4

4 に答える 4

17

型をシリアル化/逆シリアル化するには、パラメーターのないコンストラクターが必要です。ここをチェックしてください:

クラスには、XmlSerializer によってシリアル化される既定のコンストラクターが必要です。

于 2010-03-23T07:36:31.670 に答える
6

ああ..追加情報があることを知りませんでした(「詳細を表示..」をクリックする必要がありました)、謎が解決しました:

Message=SDB.DatabaseInformation は、パラメーターなしのコンストラクターがないため、シリアル化できません。

于 2010-03-23T07:37:00.630 に答える
1

この例外も発生していましたが、デフォルトのコンストラクターがないためではありませんでした。XML ドキュメントの一部ではない追加のプロパティ (aListおよび) がいくつかありました。Dictionary

これらのプロパティを装飾することで[XmlIgnore]、問題は解決しました。

于 2013-09-24T20:20:01.890 に答える
0

オーバーロードされたコンストラクターを呼び出す既定のコンストラクターを提供することで、これを回避できます。例えば:

public DatabaseInformation() : this ("defaultName"){}
于 2012-11-26T19:18:20.487 に答える