反序列化无法跨项目运行

本文关键字:项目 运行 反序列化 | 更新日期: 2023-09-27 18:23:50

我遇到Json.NET(6.0.5版)的问题,这让我有点困惑。

我的一个要序列化的类看起来像这样:

[JsonConstructor]
public MyContainerClass(IEnumerable<AbstractBaseClass> myDerivedUnitClasses)
{
    if (myDerivedUnitClasses == null)
    {
        Units = ImmutableHashSet.Create<object>();
    }
    else
    {
        Units = myDerivedUnitClasses.ToImmutableHashSet();
    }
}
public IEnumerable<AbstractBaseClass> Units { get; private set; }

TypeNameHandling设置为TypeNameHandling.Auto的情况下使用Json.Convert可以毫无问题地对此进行串行化。序列化的JSON包括属性的预期$type限定符:"System.Collections.Immutable.ImmutableHashSet`1[[AbstractBaseClass, MyLibrary]], System.Collections.Immutable"

在我的解决方案中,我有一个项目序列化了数据结构,另一个项目使用Json.Convert反序列化(反序列化也使用自动类型名称处理)。反序列化失败,出现以下错误:Error resolving type specified in JSON System.Collections.Immutable.ImmutableHashSet`1[[AbstractBaseClass, MyLibrary]], System.Collections.Immutable

使用Json.NET的源代码,我将错误追溯到DefaultSerializationBinder调用assembly.GetType(string name)并得到null

到目前为止还很糟糕。现在让我特别困惑的是:当我在序列化数据结构的同一代码块中反序列化JSON时,一切都很好(使用与我在其他项目中使用的代码相同的代码)。

谢谢你的帮助。

反序列化无法跨项目运行

发现一个项目中包含AbstractBaseClass的程序集存在程序集绑定问题。我在调试时使用了Visual Studio Tools的fuslogvw.exe来检查错误,并注意到搜索的目录不是我期望的目录,也不包含程序集文件。

我的解决方案是在反序列化之前订阅AppDomain.CurrentDomain.AssemblyResolve-事件,然后通过事件处理程序中的Assembly.LoadFrom从正确的路径手动加载程序集。