在其他情况下,有人建议你简单地添加一个SerializationBinder,它从组件类型中删除版本。但是,当使用在签名程序集中找到的类型的泛型集合时,该类型将严格基于程序集进行版本化。反序列化使用不同版本签名程序集编写的泛型的最佳方式是什么?
这是我找到的作品。
internal class WeaklyNamedAppDomainAssemblyBinder : SerializationBinder
{
public override Type BindToType(string assemblyName, string typeName)
{
ResolveEventHandler handler = new ResolveEventHandler(CurrentDomain_AssemblyResolve);
AppDomain.CurrentDomain.AssemblyResolve += handler;
Type returnedType;
try
{
AssemblyName asmName = new AssemblyName(assemblyName);
var assembly = Assembly.Load(asmName);
returnedType = assembly.GetType(typeName);
}
catch
{
returnedType = null;
}
finally
{
AppDomain.CurrentDomain.AssemblyResolve -= handler;
}
return returnedType;
}
Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
string truncatedAssemblyName = args.Name.Split(',')[0];
Assembly assembly = Assembly.Load(truncatedAssemblyName);
return assembly;
}
}
然而,导致结合过程中改变全球似乎是相当危险的我。奇怪的事情可能发生,如果序列化发生在多个线程。也许更好的解决方案是做typeName的一些正则表达式操作?
编辑:基于字符串的方法不起作用。泛型显然需要一个完整的强命名类型。如果你问我,真是令人发指。
快速注意:由于我的特殊情况,我无法使用.NET 2.0或更低版本以外的任何类型的序列化。 – 2010-04-05 16:06:49
使用app.config文件中的''应该更安全,不需要代码。 –
2010-04-05 16:14:17
这是在广泛分布的库中使用,因此不能由app.config控制。 – 2010-04-05 16:56:36