在其它情况下,已经提出,只需添加一个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使用泛型类型,你需要使用弱类型名称,而不是完全限定的类型名称。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top