。Net标准2.0 dll的.Net 45序列化

问题描述 投票:3回答:1

我有一个.Net标准2.0应用程序,该应用程序引用.Net45 dll中的某些合同。我这样做的印象是,一旦这些合约对象被序列化,它们将使用.Net45程序集类型来完成。使用.Net45库(这是最终目标)对这些文件进行反序列化现在给出了错误:

在JSON'System.Collections.Generic.Dictionary`2 [[System.String,System.Private.CoreLib],[System.String,System.Private.CoreLib]中指定的错误解决类型,],System.Private.CoreLib'

显然是因为它试图从Standard程序集类型而不是mscorlib解析字符串类型。有什么办法可以实现我的尝试?

c# .net .net-standard jsonserializer .net-standard-2.0
1个回答
0
投票

有许多不同的方法可以解决此问题。

对于无法轻松转换为自定义ISerializationBinder的大型代码库我已经实现了重定向(虽然不漂亮,但是可以工作)

RedirectAssembly("System.Private.CoreLib", "mscorlib");

public static void RedirectAssembly(string fromAssemblyShotName, string replacmentAssemblyShortName)
{
    Console.WriteLine($"Adding custom resolver redirect rule form:{fromAssemblyShotName}, to:{replacmentAssemblyShortName}");
    ResolveEventHandler handler = null;
    handler = (sender, args) =>
    {
        // Use latest strong name & version when trying to load SDK assemblies
        var requestedAssembly = new AssemblyName(args.Name);
        Console.WriteLine($"RedirectAssembly >  requesting:{requestedAssembly}; replacment from:{fromAssemblyShotName}, to:{replacmentAssemblyShortName}");
        if (requestedAssembly.Name == fromAssemblyShotName)
        {
            try
            {
                Console.WriteLine($"Redirecting Assembly {fromAssemblyShotName} to: {replacmentAssemblyShortName}");
                var replacmentAssembly = Assembly.Load(replacmentAssemblyShortName);
                return replacmentAssembly;
            }
            catch (Exception e)
            {
                Console.WriteLine($"ERROR while trying to provide replacement Assembly {fromAssemblyShotName} to: {replacmentAssemblyShortName}");
                Console.WriteLine(e);
                return null;
            }
        }

        Console.WriteLine($"Framework faild to find {requestedAssembly}, trying to provide replacment from:{fromAssemblyShotName}, to:{replacmentAssemblyShortName}");

        return null;
    };

    AppDomain.CurrentDomain.AssemblyResolve += handler;
}
© www.soinside.com 2019 - 2024. All rights reserved.