【问题标题】:Deserialization not working across projects反序列化不适用于跨项目
【发布时间】:2014-09-19 20:32:27
【问题描述】:

我在使用 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 设置为 TypeNameHandling.Auto 可以毫无问题地进行序列化。序列化的 JSON 包含属性的预期 $type-qualifier:"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 时,一切正常(使用我在其他项目中使用的相同代码)。

感谢您的帮助。

【问题讨论】:

  • 尝试将不可变集合的程序集引用添加到反序列化数据的项目中。

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


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-20
    • 1970-01-01
    相关资源
    最近更新 更多