세 가지 구성 요소가 있습니다.
앱은 프로세서 라이브러리를 호출하고 다음 유형의 클래스를 전달합니다.
ClassA : IElement
ClassA는 프로세서로 전달되기 전에 직렬화됩니다. 프로세서는 기본 라이브러리이며 ClassA와 같은 클래스 유형에 대해 알지 못합니다. 그러나 IElement에 대해 알고 있습니다. 프로세서는 전달 된 IElement (ClassA 유형)를 역 직렬화합니다.
문제는 인터페이스를 역 직렬화 할 수 없다는 것입니다. 그러나 프로세서는 ClassA에 대해 알지 못하므로 알 수 없습니다. 이 경우 전달 된 객체에 대한 참조를 어떻게 얻을 수 있습니까?
이를 처리하는 한 가지 방법은 classA를로드하는 SerializationBinder 구현을 만든 다음, 바인더 인스턴스에 대한 참조를 Processor.dll에 전달하여 Processor.dll이 역 직렬화에 바인더 구현을 사용할 수 있도록하는 것입니다. 이렇게하면 앱 모듈에서 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");
}
}
이 예에서는 매우 간단한 직렬화 바인더를 사용하고 있습니다. 이는 App 어셈블리에서 정의되어야하므로 App 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의 다른 예는 이 MSDN 예제 를 참조하십시오 .
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다