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 を正しく実装します