这个问题可能写得更详细,但我真的不知道从哪里开始。我已经想出了解决方案,所以这里是详细信息。
首先,您必须实现SerializationBinder。在BindToType 覆盖中,您将获得程序集名称和类型名称作为字符串。当程序集名称用于您不知道的程序集时,返回一个指示它未知的标记类型;为此,我创建了一个class UnknownType {}。
class UnknownType { }
class UnknownBinder : SerializationBinder
{
bool IsUnknown(string asmName)
{
// your impl here
throw new NotImplementedException();
}
public override Type BindToType(string assemblyName, string typeName)
{
if(IsUnknown(assemblyName))
{
return typeof(UnknownType);
}
return Type.GetType(typeName);
}
}
第二步是实现ISurrogateSelector 和ISerializationSurrogate。这些将被实现为在遇到UnknownType 时“返回null”。
class UnknownSurrogateSelector : ISurrogateSelector, ISerializationSurrogate
{
public void ChainSelector(ISurrogateSelector selector)
{
}
public ISurrogateSelector GetNextSelector()
{
return null;
}
public ISerializationSurrogate GetSurrogate(Type type, StreamingContext context, out ISurrogateSelector selector)
{
if(type == typeof(UnknownType))
{
selector = this;
return this;
}
selector = null;
return null;
}
public void GetObjectData(object obj, SerializationInfo info, StreamingContext context)
{
throw new NotImplementedException();
}
public object SetObjectData(object obj, SerializationInfo info, StreamingContext context, ISurrogateSelector selector)
{
if (obj is UnknownType)
return null;
return obj;
}
}
代理选择器附加到 BinaryFormatter 实例的 SurrogateSelector 成员,而活页夹附加到 Binder 成员。