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

时间:2014-07-17 15:01:53

标签: json.net

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

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

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

2 个答案:

答案 0 :(得分:6)

这让我觉得它可能是Json.NET中的一个bug /限制。

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

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

一种可能的解决方法是让活页夹将所需的程序集名称与每个程序集的完全限定名称进行比较。

答案 1 :(得分:2)

尝试更改序列化设置以包含以下内容:

jsonSerializerSettings.TypeNameAssemblyFormat =
    System.Runtime.Serialization.Formatters.FormatterAssemblyStyle.Full;