我遇到了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时,我将数据结构序列化,一切都很好(使用我在其他项目中使用的相同代码)。
感谢您的帮助。
答案 0 :(得分:0)
原来在一个项目中有关于包含AbstractBaseClass
的程序集的程序集绑定问题。我在调试时使用了fuslogvw.exe
的Visual Studio工具来检查错误,并注意到搜索的目录不是我期望的目录,也没有包含汇编文件。
我的解决方案是在反序列化之前订阅AppDomain.CurrentDomain.AssemblyResolve
- 事件,然后通过事件处理程序中的Assembly.LoadFrom
从正确的路径手动加载程序集。