C# Raven DB JsonSerializationException无法加载程序集
当我试图检索一个包含在动态加载的DLL中找到其类型的实体列表的文档时,我得到一个C# Raven DB JsonSerializationException无法加载程序集,c#,json.net,ravendb,C#,Json.net,Ravendb,当我试图检索一个包含在动态加载的DLL中找到其类型的实体列表的文档时,我得到一个jsonSerialization异常,该异常表示它在动态加载的DLL中找不到该类型:无法加载程序集“Sandbox\u One” 我使用RavenDB(build 2681)来存储使用创建的实体,尽管我认为这不是一个问题。每个实体都继承一个非动态接口IEntity。Raven会话是在.NET MVC 4操作的任一侧创建的(根据),我可以将动态实体保存到IEntity列表中 当我试图从文档中加载实体列表时,会出现序列
jsonSerialization
异常,该异常表示它在动态加载的DLL中找不到该类型:无法加载程序集“Sandbox\u One”
我使用RavenDB(build 2681)来存储使用创建的实体,尽管我认为这不是一个问题。每个实体都继承一个非动态接口IEntity
。Raven会话是在.NET MVC 4操作的任一侧创建的(根据),我可以将动态实体保存到IEntity
列表中
当我试图从文档中加载实体列表时,会出现序列化错误。目前,我只有一个实体类型(客户)的单个实例(蓝眼睛)
观察
- 在数据库中,实体的外观与我预期的完全相同:
RavenSession
从基本控制器继承,与
引发异常的加载调用:
public List<IEntity> GetDataForRealm(IDocumentSession session, Realm realm)
{
var realmData = session.Load<RealmData>(realm.RealmDataId); // Exception thrown
return realmData.Entities;
}
公共列表GetDataForRealm(IDocumentSession会话,领域领域)
{
var realmData=session.Load(realm.realmData);//引发异常
返回realmData.Entities;
}
领域数据类:
public class RealmData
{
public RealmData()
{
Entities = new List<IEntity>();
}
public List<IEntity> Entities { get; set; }
}
公共类RealmData
{
公共RealmData()
{
实体=新列表();
}
公共列表实体{get;set;}
}
提前感谢您的帮助 我的解决方案是在应用程序域上实现一个
AssemblyResolve
事件处理程序
GetDataForRealm
方法变为:
public List<IEntity> GetDataForRealm(IDocumentSession session, Realm realm)
{
AppDomain.CurrentDomain.AssemblyResolve += (s, a) => MyResolveEventHandler(s, a, realm.Assembly);
var realmData = session.Load<RealmData>(realm.RealmDataId);
return realmData.Entities;
}
我认为发生了什么:
当JSON.Net反序列化程序反映出动态类型时,它在AppDomain.CurrentDomain
中找不到程序集。当AppDomain
无法按名称找到程序集时,将调用该处理程序。我的程序集位于AppDomain中(我使用assembly.Load),但找不到它
注意:
我用一个额外的参数扩展了myresolveventhandler
,因为我已经有了所需的程序集。如果内存中没有程序集(但知道它在哪里),则可以将其加载到MyResovleEventHandler
中
更新
稍后,您可能会发现将数据分配给这些结果对象时遇到问题。这是因为通过AppDomain
传递实体并不意味着它会更改对象的域。相反,它只是提供了一个参考。相反,我发现让RavenDB首先在正确的(临时的)域中使用一个自定义JSON转换器(在成员中有动态程序集)创建对象更容易
public List<IEntity> GetDataForRealm(IDocumentSession session, Realm realm)
{
var realmData = session.Load<RealmData>(realm.RealmDataId); // Exception thrown
return realmData.Entities;
}
public class RealmData
{
public RealmData()
{
Entities = new List<IEntity>();
}
public List<IEntity> Entities { get; set; }
}
public List<IEntity> GetDataForRealm(IDocumentSession session, Realm realm)
{
AppDomain.CurrentDomain.AssemblyResolve += (s, a) => MyResolveEventHandler(s, a, realm.Assembly);
var realmData = session.Load<RealmData>(realm.RealmDataId);
return realmData.Entities;
}
private Assembly MyResolveEventHandler(object sender, ResolveEventArgs args, Assembly assembly)
{
if (assembly.GetName().Name == args.Name)
{
return assembly;
}
return null;
}