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

And*_*ens 3 json.net

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

"Features": [{
    "$type": "FeaturesAssembly.SomeFeature, FeaturesAssembly",
    // Other serialized properties
}]
Run Code Online (Sandbox Code Playgroud)

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

Mat*_*aig 6

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

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

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

一个可能的解决方法是使绑定器将所需的程序集名称与每个程序集的完全限定名称进行比较.