none
動的に読み込んだDLLでどうすればデシリアライズできるのでしょうか RRS feed

  • 質問

  •  

    Serializableを適用し、ISerializableインターフェースを実装しているクラスを含むDLLを、動的に読み込んでいるのですが、デシリアライズができません。

     

    シリアライズ、デシリアライズは、BinaryFormatterクラスのSerialize()メソッド、Deserialize()メソッドを使用していますが、デシリアライズ時に、動的に読み込んでいるDLLが読み込まれていないと、Exceptionが発生してしまいます。

     

    DLLの動的読み込みは、Assembly.LoadFrom()メソッドで実装しています。

    DLLを読み込むときに、他にも何かする必要がありますでしょうか?

     

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

    2008年5月12日 12:58

回答

  • 動的に読み込むDLLは、アプリケーションフォルダ(プライベートフォルダ)のサブフォルダ
    ということですが、そのことを、アプリケーション構成ファイルの <probing privatePath>で
    アプリケーション(CRL)には教えているでしょうか?

    Deserializeメソッド内部では、独自にDLLをLoadしてDeserialize対象の型を探している
    はずなので、プローブさせたい独自のサブフォルダをアプリケーション構成ファイルで
    指定してあげないと、アセンブリのロードエラーになるはずです。

    尚、ISerializableを実装した型には、(SerializationInfo info, StreamingContext context)
    をパラメータとするコンストラクタも必要になります。

    試してみてください。
    2008年5月13日 10:09

すべての返信

  • もうちょっと整理して頂けますか?

     

    前提

    ・ISerializeを実装したクラスを含むDLLがある。

    ・SerializeをするときはこのDLLをAssembly.LoadFromメソッドで読み込んでいる。

     

    ここまでは問題ないと思います。問題は次の項目です。

     

    「DeserializeするときはDLLを事前に(Assembly.LoadFromメソッドで)読み込んでいない。」

     

    この認識で問題ないでしょうか?

    以下はこの認識に基づいて記述します。

    ----------------------------------------

    アセンブリ(DLL)が読み込まれていない場合、そのクラスの詳細は分かりません。

    その状態でDeserializeしても、自動的にアセンブリ(DLL)が読み込まれるようなことはありません。

     

    Deserializeするためにはそのクラスを含むアセンブリ(DLL)を予め(Assembly.LoadFromメソッド等で)読み込んでおく必要があります。

    2008年5月12日 14:57
    モデレータ
  • ご回答ありがとうございます。

     

    ・ISerializeを実装したクラス(仮にクラス名A)を含むDLLを動的にAssembly.LoadFormで読み込んでいます。

    ・上記と同じDLLにSerialize,Deserializeをさせるクラス(仮にクラス名B)も実装しています。

     

    クラスA、クラスBが同一のDLLですので、読み込まれているはずなのですが、読み込まれていないとエラーとなってしまいます。

     

     

    エラーとの関連はないかもしれませんが、動的に読み込むDLLは、アプリケーション(EXE)とは別のフォルダに格納しています。

     

    ・アプリケーションは、”フォルダXXX”に格納しています。

    ・動的に読み込むDLLは、”フォルダXXX/YYY”に格納しています。

    ・”フォルダXXX/YYY”には、上記DLLのみ格納されています。

     

    よろしくお願いいたします。

    2008年5月13日 1:35
  • 動的に読み込むDLLは、アプリケーションフォルダ(プライベートフォルダ)のサブフォルダ
    ということですが、そのことを、アプリケーション構成ファイルの <probing privatePath>で
    アプリケーション(CRL)には教えているでしょうか?

    Deserializeメソッド内部では、独自にDLLをLoadしてDeserialize対象の型を探している
    はずなので、プローブさせたい独自のサブフォルダをアプリケーション構成ファイルで
    指定してあげないと、アセンブリのロードエラーになるはずです。

    尚、ISerializableを実装した型には、(SerializationInfo info, StreamingContext context)
    をパラメータとするコンストラクタも必要になります。

    試してみてください。
    2008年5月13日 10:09
  • happylyreさんの指摘内容でも外れている場合は、現象発生時のExceptionのメッセージを出して下さい。

    このまま推測を続けるよりは、原因が明確になる可能性があります。

    2008年5月13日 14:14
    モデレータ
  • ご回答ありがとうございました。

     

    アプリケーション構成ファイルに、privatePathを追加することにより、

    デシリアライズが正常に処理されました。

     

    ご回答くださった方々に感謝いたします。

    ありがとうございました。
    2008年5月14日 2:05