从.Net Standard 2.0 dll进行.NET 4.5序列化

3
我有一个 .Net standard 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 中解析字符串类型。是否有任何方法实现我所尝试的内容呢?

查看.NET版本的兼容性表,确定您必须使用哪个版本。据我所知,该表并不完全准确,需要4.7版本才能获得完整的.NETStandard 2.0兼容性。这真是一团糟。 - Hans Passant
是的,我还没有能够从中得出太多意义,这是各种组合的第12次迭代! - Grace
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;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接