json.net:如何反序列化动态加载的程序集中的类型?

标签 json.net

我使用 Assembly.LoadFrom() 动态加载程序集,然后使用 .CreateInstance() 实例化其某些类型。接下来,我将这些对象放入一个数组中,并使用 json.net 将其序列化为文件(使用 TypeNameHandling.Auto 配置)。在文件中我可以看到它存储了正确的类型名称,例如:-

"Features": [{
    "$type": "FeaturesAssembly.SomeFeature, FeaturesAssembly",
    // Other serialized properties
}]

问题是我无法反序列化该文件。 Json.net 抛出 JsonSerializationException,消息“无法加载程序集‘FeatureAssembly’”,尽管首先动态加载了必要的程序集。我错过了什么?

最佳答案

在我看来,这可能是 Json.NET 中的错误/限制。

深入研究 DefaultSerializationBinder.GetTypeFromTypeNameKey() 的源代码(例如 here ),绑定(bind)器首先尝试从应用程序目录和 GAC 中按部分名称加载所需的程序集。如果失败,它会将所需的程序集名称与当前应用程序域中加载的所有程序集的完全限定名称进行比较。

当 JSON 文档仅包含简单的程序集名称(默认)时,最后一步永远不会找到匹配项,即使所需的程序集已加载到当前应用程序域中也是如此。

一种可能的修复方法是让绑定(bind)器将所需的程序集名称与每个程序集的完全限定名称和简单名称进行比较。

关于json.net:如何反序列化动态加载的程序集中的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24807110/

相关文章:

c# - 无法识别用于 silverlight 的 JSON.net 5.0 nuget 包

c# - 如何模拟(使用 Moq)由 Newtonsoft.json 序列化的接口(interface)?

c# - 正确重写 Newtonsoft.Json 方法

c# - 如何使用 C# 在 Json 中通过键的名称获取值列表

c# - JSON.NET:在不重新解析的情况下缩小/格式化内容

c# - 从分层 JSON 中挑选出简单的属性

json - 在 json 模式中定义键值对的正确方法是什么

c# - 在 Newtonsoft JSON 中转义引号

c# - Json.net:JObject.SelectToken 可以做 XPath 可以做的事情吗?如果是,语法是什么?

asp.net - 在 MVC Controller 中将 JSON 绑定(bind)到 JToken