0

私は3つのコンポーネントを持っています:

  • ユーティリティ ライブラリ (Processor.dll): Element ライブラリについてしか知らない
  • 要素ライブラリ (IElement): どのライブラリについても知りません
  • アプリ: 両方のライブラリについて知っている

アプリは Processor ライブラリを呼び出し、次の型のクラスを渡します。

ClassA : IElement

ClassA は、プロセッサーに渡される前にシリアライズされます。Processor はベース ライブラリであり、ClassA などのクラス タイプを認識しません。ただし、IElement については認識しています。プロセッサは、渡された ClassA 型の IElement を逆シリアル化します。

問題は、インターフェイスを逆シリアル化できないことです。しかし、プロセッサは ClassA について認識していないため、認識すべきではありません。この場合、渡されたオブジェクトへの参照を取得するにはどうすればよいですか?

4

1 に答える 1

1

これを処理する 1 つの方法は、classA をロードする SerializationBinder 実装を作成し、バインダーのインスタンスへの参照を Processor.dll に渡して、Processor.dll がバインダー実装を逆シリアル化に使用できるようにすることです。これにより、ClassA を参照するコードを App モジュールに保持できます (もちろん、SerializationBinder 実装は App モジュールで定義する必要があります)。

以下に例を示します: Element ライブラリにあるこのインターフェースを考える

public interface IElement
{
    string DoSomething(string param);
}

次のようにプロセッサを定義します。

public class ProcessorClass
{
    private SerializationBinder _binder;

    public ProcessorClass(SerializationBinder binder)
    {
        _binder = binder;
    }

    public string CallDoSomething(Stream s)
    {
        var formatter = new BinaryFormatter();

        formatter.Binder = _binder;

       var i = (IElement)formatter.Deserialize(s);

        return i.DoSomething("the processor");
    }
}

この例では、非常に単純なシリアライゼーション バインダーを使用しています。ClassAこれは App アセンブリで定義する必要があることに注意してください。そのため、App以外の場所への参照は必要ありません。

class Binder : SerializationBinder
{
    //WARNING: demonstration only, DO NOT USE in production code
    public override Type BindToType(string assemblyName, string typeName)
    {
        return Type.GetType("ClassA");
    }
}

次に、すべてを App アセンブリにまとめます。

var ms = new MemoryStream();

var formatter = new BinaryFormatter();

var theObject = new ClassA();

formatter.Serialize(ms, theObject);

var processor = new ProcessorClass(new Binder());

ms.Seek(0, SeekOrigin.Begin);

string result = processor.CallDoSomething(ms);

SerializationBinder の別の例については、この MSDNの例を参照してください。

于 2013-08-26T04:20:31.133 に答える