C# 只有接口可用时如何反序列化?

C# 只有接口可用时如何反序列化?,c#,.net,serialization,deserialization,binary-deserialization,C#,.net,Serialization,Deserialization,Binary Deserialization,我有三个部分: 实用程序库(Processor.dll):只知道元素库 元素库(IEElement):不知道任何库 应用程序:了解这两个库 应用程序调用处理器库并向其传递类型为的类: ClassA : IElement ClassA在传递给处理器之前被序列化。Processor是一个基本库,不知道诸如ClassA之类的类类型。不过,它确实了解IELENT。处理器将反序列化传递给它的IEElement,它是ClassA类型 问题是无法反序列化接口。但处理器不知道ClassA,也不应该知道。在

我有三个部分:

  • 实用程序库(Processor.dll):只知道元素库
  • 元素库(IEElement):不知道任何库
  • 应用程序:了解这两个库
应用程序调用处理器库并向其传递类型为的类:

ClassA : IElement
ClassA在传递给处理器之前被序列化。Processor是一个基本库,不知道诸如ClassA之类的类类型。不过,它确实了解IELENT。处理器将反序列化传递给它的IEElement,它是ClassA类型


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

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

下面是一个示例:给定元素库中的这个接口

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

class Binder : SerializationBinder
{
    //WARNING: demonstration only, DO NOT USE in production code
    public override Type BindToType(string assemblyName, string typeName)
    {
        return Type.GetType("ClassA");
    }
}
然后,我们将所有这些信息汇集到应用程序集中:

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的另一个示例,请参见此。

如何将“序列化”数据传递给“处理器”?处理器需要实现
IElement
,才能对其进行反序列化。我肯定会重新考虑你关于拥有一个在双方都被引用的类的立场。考虑创建<代码> ClassADto < /代码>。从链接中,反序列化方法引用了VoReNo2Type。由于反序列化在Processor.dll中,这意味着处理器需要了解Version2Type(在我的例子中是ClassA)。或者我错了吗?MSDN示例使用具体类型来强制转换反序列化的结果。在您的情况下,您将转换到IEElement接口。我添加了一些示例代码来演示。