C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[3]: 異なるアセンブリに入っているクラスのデシリアライズについて


(過去ログ 20 を表示中)

[トピック内 4 記事 (1 - 4 表示)]  << 0 >>

■8111 / inTopicNo.1)  異なるアセンブリに入っているクラスのデシリアライズについて
  
□投稿者/ 枕元切爪 (1回)-(2007/09/24(Mon) 12:10:17)

分類:[.NET 全般] 

はじめまして。
枕元切爪と申します。

「異なるアセンブリに入っているクラスのデシリアライズについて」ご質問させてください。

抽象クラスであるAbstractClassと、これから派生した任意のクラス群があります。
ただし、派生クラスはプラグインのような利用方法をとるので、親クラスとは別個のアセンブリに納められており、
dllとして特定のフォルダにすべて詰め込まれています。

ここで、シリアライズしたxmlファイルをもとにデシリアライズを行おうとすると、
「SerializationException ・・・・・・・ *******に関連付けられているアセンブリはありません。」
という例外が発生します。*******は派生クラス名称です。
派生クラスが抽象クラスと同一のアセンブリに入っているとエラーは生じません。
具体的には以下のようなコードを利用しています。

FileStream stream = File.OpenRead(@".\MyClass-Soap.xml");
抽象クラス名称 aClass = (抽象クラス名称)soapFormatter.Deserialize(stream);

このあたりのプログラムはほとんど書いたことが無く、見当はずれなことをしているかもしれませんが、
何か解決策についてご助言いただければ幸いです。

どうぞよろしくお願いいたします。

引用返信 編集キー/
■8115 / inTopicNo.2)  Re[1]: 異なるアセンブリに入っているクラスのデシリアライズについて
□投稿者/ なちゃ (62回)-(2007/09/24(Mon) 16:23:39)
多分元々LoadFromでアセンブリをロードしてるんだと思いますが、デシリアライズのときはアセンブリが自動的にロードされるため、Loadで読める場所にアセンブリが必要になります。
あらかじめLoadFromでロードしておくか、AssemblyResolveだったかのイベントで自前でロードしてやれば出来るとは思いますが、あんまりおすすめは出来ないです。
例えば今回のエラーの原因が想像つかない状態ですと、後々いろんなトラブルに出くわす可能性がありますし、そのときにどうすることも出来なくなるかもしれません。

あとはプライベートな検索パスにプラグインのディレクトリも追加しておくか…
プラグイン的なものなど、Loadで読めない物をシリアライズするのはあまりおすすめできないです。

引用返信 編集キー/
■8118 / inTopicNo.3)  Re[2]: 異なるアセンブリに入っているクラスのデシリアライズについて
□投稿者/ なちゃ (63回)-(2007/09/24(Mon) 17:59:37)
> あらかじめLoadFromでロードしておくか、

んーこれは駄目だったかも…

引用返信 編集キー/
■8290 / inTopicNo.4)  Re[3]: 異なるアセンブリに入っているクラスのデシリアライズについて
□投稿者/ 枕元切爪 (2回)-(2007/09/27(Thu) 12:01:59)
出張により、ご返信、大変遅くなりました。
申し訳ありません。

お教えいただいたように、とりあえずは、実行アセンブリと同階層にdllファイルを置き、
自動的にロードされる仕様としました。
今後、同階層が混雑してきた場合にどうするか、検討せねばなりませんが。

ユーザーにより、ソースコードレベルでの機能追加が必須なタイプのプログラムなので、
このあたりのこと、もっと勉強せねばならないと感じています。

ご助言有難うございました。
今後ともよろしくお願いいたします。

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -