Pandoraの開発日記

~日々の開発の中で悩んでいる問題や簡単なTips~

目次

Blog 利用状況

書庫

日記カテゴリ

コミュニテイサイト

過去日記

Dictionary ジェネリック クラスにはまってしまった。(シリアライズ化における注意事項)

.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){}

皆さんもジェネリック クラスを継承して拡張クラスを作成する際には気をつけて下さいね。

投稿日時 : 2007年6月7日 15:16

コメントを追加

# re: Dictionary ジェネリック クラスにはまってしまった。 2007/06/07 15:35 シャノン

とゆーか、それは、ジェネリッククラスとかDictionaryとか関係なく、シリアライズ一般に関する話題です。

# re: Dictionary ジェネリック クラスにはまってしまった。 2007/06/07 16:05 Pandora

シャノン さん、コメントありがとうございます。

よくよく考えたら、シリアライズ一般の話ですね。

御指摘ありがとうございました。

# re: Dictionary ジェネリック クラスにはまってしまった。(シリアライズ化における注意事項) 2007/06/07 16:10 囚人

コンストラクタが継承できないという事に加えて ISerializable の逆シリアル化のアクションがメソッドではなくコンストラクタなので実装をつい忘れてしまう事に加えて SerializableAttribute は Inherited = false 。
メンドーですね。

# re: Dictionary ジェネリック クラスにはまってしまった。(シリアライズ化における注意事項) 2007/06/07 16:19 Pandora

囚人 さん、コメントありがとうございます。

>ISerializable の逆シリアル化のアクションがメソッド
>ではなくコンストラクタなので実装をつい忘れてしまう

 そうそう、コンストラクタは忘れる可能性大ですね。

 忘れた時の為に例外で気づかせてくれるのでしょうね。

 気づかせてくれのはいいが、それに関する情報が少ない
 感じがする。
 

# re: Dictionary ジェネリック クラスにはまってしまった。(シリアライズ化における注意事項) 2007/06/08 6:42 渋木宏明(ひどり)

>忘れた時の為に例外で気づかせてくれるのでしょうね。

確かに、実行時ではなくコンパイル時に警告してくれてもよさそうなもんですね。必要な材料は揃ってるわけだし。

# re: Dictionary ジェネリック クラスにはまってしまった。(シリアライズ化における注意事項) 2007/06/08 10:05 Pandora

渋木宏明(ひどり) さん、コメントありがとうございます。

> コンパイル時に警告してくれてもよさそうなもんですね。

 なるほど、コンパイル時の警告ですね。

 そうしてくれるとすごくありがたいですね。

タイトル  
名前  
URL
コメント