.NET 2.0 からジェネリックが導入され、Hashtable の変わりに Dictionary を使用してきました。
ただ、コレクションに格納されている値を取得する際に、提供されているプロパティやメソッドは非常に
使いにくかったので、Dictionary を継承して BaseDictionary という拡張クラスを作成し使用していました。
昨日、リモーティングでこのBaseDictionaryを含んだクラスを使用して値の受け渡しをした際に、下記の
例外が発生してしまいました。
{"BaseDictionary~型のオブジェクトを逆シリアル化するコンストラクタが見つかりませんでした。"}
当初、この意味は何??... Dictionary は、ISerializable インターフェイスを継承しているはずだし....
という状態でした。
もしかして、独自でシリアル化のコードを書かなければいけないだろうかと思い、とりあえず BaseDictionary
クラスに ISerializable インターフェイスを継承して、とりあえず版のGetObjectData メソッドを用意し、確認テスト。
結果、かわらず例外エラー。うーん(~_~;)
色々ネットで調べたら、ISerializable インターフェイスを継承すると専用(特別)のコンストラクタも必要みたい
でしたので、この専用(特別)なコンストラクタを用意し、再度、確認テスト。
結果、例外エラー発生せず正常終了。
もしかして、この専用(特別)のコンストラクタがなかったことが真の原因かと思い、コンストラクタ以外の追加
したのを削除し、再度、確認テスト。
結果、無事に正常終了。
ということで、Dictionary ジェネリック クラスを継承する際には、この専用(特別)なコンストラクタが必要です。
この専用(特別)なコンストラクタを下記に記述しておきます。
?protected BaseDictionary(SerializationInfo info,StreamingContext context):base(info,context){}
皆さんもジェネリック クラスを継承して拡張クラスを作成する際には気をつけて下さいね。