動的にロードされる型のSerializationException

以前の質問(インターフェイスのXMLシリアル化)の結果、別の問題が発生しました...

私は、データベースからデータをエクスポートするアプリケーションを持っています。エクスポート手順は、呼び出しに使用される共通インタフェースを実装する異なる具体的なクラスによって実装されます。

具体的な実装はプラグイン(DLL)としてロードされるため、私は自分のコードで直接参照しません。

I need to serialize instances of these concrete classes as byte arrays into my database, but now when I try to deserialize them from a byte array I obtain a SerializationException: Unable to find assembly …

私はそれが私のインターフェイスの具体的な実装で実行時にDLLを読み込むため、appensと思う...

どうすれば解決できますか?

NOTE I'm using this code to deserialize objects:

    public static object DeSerialize(byte[] arrayToDeSerialize)
    {
        object serializedObject;
        using (MemoryStream stream = new MemoryStream(arrayToDeSerialize))
        {
            //Creating binary formatter to De-Serialize string.
            BinaryFormatter formatter = new BinaryFormatter();

            //De-Serializing.
            serializedObject = formatter.Deserialize(stream);
        }
        return serializedObject;
    }
0

1 答え

AppDomain.AssemblyResolve イベントをフックしてアセンブリを必要に応じて使用できます。実行時に解決できないアセンブリが必要になるたびにイベントが発生します。 「アセンブリを見つけることができません」例外がスローされる前に、アセンブリを最後に提供する機会が与えられます。例は私がリンクしたページにあります。

4
追加された
AppDomain.CreateDomain AssemblyResolve CurrentDomain 用です。
追加された 著者 Kiquenet,
この提案をありがとうございます、私はそれが私の問題を解決することができると思うが、私はそれを私のデシリアライズメソッドに適用する方法を理解できません...申し訳ありませんが、私は.NETシリアル化
追加された 著者 davioooh,
私は AppDomain とイベントハンドラを宣言しなければならないWinFormアプリケーションで作業していますか?私の Program クラスにありますか?
追加された 著者 davioooh,
MyResolveEventHandler に、次のように入力しました: Type resType = Type.GetType(args.Name); resType.Assembly;を返しますが、resTypeは常に null です。私が間違っている?
追加された 著者 davioooh,
詳細は私の編集を参照してください
追加された 著者 Chris Shain,
AppDomain.CurrentDomainを使用してください: msdn.microsoft.com/en-us/ us/library /… をご覧ください。あなたのメインは、おそらくそのイベントをフックするのに適しています。
追加された 著者 Chris Shain,
解決された型を返す必要があります。イベントハンドラのための奇妙なセマンティクス。下のAssemblyResolveの元のリンクの例を参照してください。 return typeof(MyType).Assembly;
追加された 著者 Chris Shain,
ああ、 Assembly.Load Assembly.LoadFrom 、または Assembly.LoadFile を使用して、別のパスからアセンブリを動的にロードする必要があります。 Type.GetType が機能していれば、この全体的なエクササイズは不必要でした。 Type.GetTypeは、既定のアセンブリ解決スキームを使用します。 > stackoverflow.com/questions/5260404/&hellip ; また
追加された 著者 Chris Shain,