反序列化不适用于项目

时间:2014-09-19 20:32:27

标签: c# json.net deserialization .net-assembly appdomain

我遇到了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; }

使用设置为Json.Convert TypeNameHandling的{​​{1}}可以毫无问题地将其序列化。序列化的JSON包含属性的预期TypeNameHandling.Auto - 限定符:$type

我在我的解决方案中有一个项目,我将数据结构序列化,另一个项目使用"System.Collections.Immutable.ImmutableHashSet`1[[AbstractBaseClass, MyLibrary]], System.Collections.Immutable"对其进行反序列化(反序列化也使用自动类型名称处理)。反序列化失败,出现此错误:Json.Convert

使用Json.NET的源代码我将错误追溯回Error resolving type specified in JSON System.Collections.Immutable.ImmutableHashSet`1[[AbstractBaseClass, MyLibrary]], System.Collections.Immutable调用DefaultSerializationBinder并获取assembly.GetType(string name)作为结果。

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

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

原来在一个项目中有关于包含AbstractBaseClass的程序集的程序集绑定问题。我在调试时使用了fuslogvw.exe的Visual Studio工具来检查错误,并注意到搜索的目录不是我期望的目录,也没有包含汇编文件。

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