什么是反序列化与不同版本的签署汇编语言编写的仿制药的最佳方式?
-
24-09-2019 - |
题
在其它情况下,已经提出,只需添加一个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的一些正则表达式操作?
修改强>的基于字符串的方法不起作用。泛型显然需要一个完整的强命名的类型。很可恶的,如果你问我。
解决方案
在AssemblyResolve事件仅当常规结合失败烧制。所以,任何可以通过正常的方法来解决会。只有反序列化操作可能会触发事件,并且你已经有了一个完全有效的战略,试图解决这些。
我想补充的AssemblyResolve事件处理程序,当程序启动,并保留在那里,而不是添加和删除它。这消除了多线程问题的潜在来源。
其他提示
而不是序列化整个集合,您可以通过迭代并单独序列的每个元素?然后你可以使用SerilizationBinder方法。
这应该回答你的问题: SerializationBinder与名单
当在SerializationBinder.BindToType使用泛型类型,你需要使用弱类型名称,而不是完全限定的类型名称。
不隶属于 StackOverflow