シリアライズ化における注意事項

SessionにHashtableを継承したクラスのオブジェクトを格納して取り出そうとしたら、
「~型のオブジェクトを逆シリアル化するコンストラクタが見つかりませんでした。」
という例外発生。
デシリアライズするコンストラクタを実装したら解決。
シリアライズ化するオブジェクトのクラスには、
[Serializable]と、デシリアライズのためのコンストラクタの実装が必要。

[Serializable]
public class Class1 : Hashtable
{
    private Hashtable copy;
    public Hashtable Copy
    {
        get { return copy; }
        set
        {
            foreach (string key in value.Keys)
            {
                copy[key] = this[key];
            }
        }
    }
    public Class1()
    {
        copy = new Hashtable();
    }
    public override object this[object key]
    {
        get
        {
            return base[key];
        }
        set
        {
            base[key] = value;
        }
    }
    protected Class1(SerializationInfo info, StreamingContext context)
        : base(info, context)
    {
        copy = new Hashtable();
    }
    public new void GetObjectData(SerializationInfo info, StreamingContext context)
    {
        info.AddValue("copy", copy, typeof(Hashtable));
    }
}

Dictionary ジェネリック クラスにはまってしまった。(シリアライズ化における注意事項)
窓際プログラマーの独り言 -C#の話題を中心に:FxCopに学ぶ番外編(4) : ISerializable を正しく実装します

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください