0

我有三个组件:

  • 实用程序库(Processor.dll):只知道元素库
  • 元素库(IElement):不知道任何库
  • 应用程序:了解这两个库

应用程序调用处理器库并传递给它一个类型的类:

ClassA : IElement

ClassA 在传递给处理器之前被序列化。Processor 是一个基础库,不知道 ClassA 等类类型。但是,它确实知道 IElement。处理器将反序列化传递给它的 IElement,它是 ClassA 类型。

问题是接口无法反序列化。但是处理器不知道 ClassA 也不应该知道。在这种情况下,如何获取对传入对象的引用?

4

1 回答 1

1

处理此问题的一种方法是创建一个加载 classA 的 SerializationBinder 实现,然后将对您的活页夹实例的引用传递给 Processor.dll,以便 Processor.dll 可以使用您的活页夹实现进行反序列化。这将允许您将引用 ClassA 的代码保留在 App 模块中(SerializationBinder 实现当然必须在 App 模块中定义)。

这是一个例子:给定元素库中的这个接口

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");
    }
}

在这个例子中,我使用了一个非常非常简单的序列化绑定器。请注意,这必须在 App 程序集中定义,这就是为什么您不需要引用ClassAApp 之外的任何地方。

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 回答