1. ホーム
  2. c#

[解決済み] Dictionary メンバを含むクラスをシリアライズする

2022-04-28 14:30:26

質問

を拡大解釈する 以前の問題 そして、設定ファイルクラスを(デ)シリアライズすることにしたのですが、これがとてもうまくいきました。

現在、マップするドライブ文字(キーはドライブ文字、値はネットワークパス)の連想配列を格納したいのですが、そのために Dictionary , HybridDictionary および Hashtable を呼び出すと、次のようなエラーが発生します。 ConfigFile.Load() または ConfigFile.Save() :

を反映したエラーが発生しました。 'App.ConfigFile'です。[snip]です。 System.NotSupportedException: できません シリアライズメンバー App.Configfile.mappedDrives [snip]です。

ディクショナリとハッシュテーブルはシリアライズできるようですが、何が間違っているのでしょうか?

[XmlRoot(ElementName="Config")]
public class ConfigFile
{
    public String guiPath { get; set; }
    public string configPath { get; set; }
    public Dictionary<string, string> mappedDrives = new Dictionary<string, string>();

    public Boolean Save(String filename)
    {
        using(var filestream = File.Open(filename, FileMode.OpenOrCreate,FileAccess.ReadWrite))
        {
            try
            {
                var serializer = new XmlSerializer(typeof(ConfigFile));
                serializer.Serialize(filestream, this);
                return true;
            } catch(Exception e) {
                MessageBox.Show(e.Message);
                return false;
            }
        }
    }

    public void addDrive(string drvLetter, string path)
    {
        this.mappedDrives.Add(drvLetter, path);
    }

    public static ConfigFile Load(string filename)
    {
        using (var filestream = File.Open(filename, FileMode.Open, FileAccess.Read))
        {
            try
            {
                var serializer = new XmlSerializer(typeof(ConfigFile));
                return (ConfigFile)serializer.Deserialize(filestream);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message + ex.ToString());
                return new ConfigFile();
            }
        }
    }
}

解決方法は?

IDictionaryを実装しているクラスはシリアライズできません。これをチェックアウト リンク .

Q: なぜハッシュテーブルのシリアライズができないのですか?

A: XmlSerializer は、以下の処理を行うことができません。 を実装するクラスは、IDictionary インターフェイスを使用します。これは スケジュールの制約と ハッシュテーブルがないこと はXSDの型に対応するものがあります。 システムです。唯一の解決策は を使用しないカスタムハッシュテーブルを実装します。 IDictionaryを実装しない インターフェイスを使用します。

ですから、このために独自のバージョンのDictionaryを作成する必要があると思います。これをチェック その他の質問 .