我使用 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/