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接口。我添加了一些示例代码来演示。