NHibernate.在Newtonsoft.Json.dll中发生LazyInitializationExceptio
本文关键字:LazyInitializationExceptio dll Newtonsoft Json NHibernate | 更新日期: 2023-09-27 18:06:57
我不能序列化然后立即反序列化一个大对象而没有问题。我采纳了以下建议:JSON。. NET和nHibernate延迟加载集合和JSON。NHibernate代理的Net序列化(NH 3.3.2.4000)来获取Json。与我的遗留系统一起工作。尽管尝试了各种建议和组合,我还是没有成功。以下是对我来说最有意义的设置,因为我理解它们。
转换器:
protected override List<MemberInfo> GetSerializableMembers(Type objectType)
{
if (typeof(INHibernateProxy).IsAssignableFrom(objectType))
{
return base.GetSerializableMembers(objectType.BaseType);
}
else
{
return base.GetSerializableMembers(objectType);
}
}
主要代码:
var jsonSerializerSettings = new JsonSerializerSettings
{
ContractResolver = new NHibernateContractResolver(),
PreserveReferencesHandling = PreserveReferencesHandling.All,
TypeNameHandling = TypeNameHandling.Auto,
ReferenceLoopHandling = ReferenceLoopHandling.Ignore,
ObjectCreationHandling = ObjectCreationHandling.Replace
};
string serialisedEnquiry = JsonConvert.SerializeObject(enquiry, Formatting.Indented, jsonSerializerSettings);
Enquiry enq = JsonConvert.DeserializeObject<Enquiry>(serialisedEnquiry, jsonSerializerSettings);
我有另一个问题开放,这可能是值得注意的:JSON.net null属性尽管你会在最后的评论中看到,我相信我已经解决了它。我只是在等待解决这个问题,以确认另一个是固定的,而不是简单地埋葬/取代这个新的错误。
Fluent NHibernate 1.4.0.0
NHibernate 3.3.1.4000
Netwonsoft。Json 6.0.0.0
编辑:我的例外是:
类型的未处理异常NHibernate。LazyInitializationException'发生在Newtonsoft.Json.dll附加信息:Initializing[Unavailable#]-failed to lazy初始化集合,没有会话或会话已关闭
我发现这个隐藏在我的JSON中:
类型:美元"NHibernate.Collection.Generic.PersistentGenericBag 1 [[ComponentModel.Role,ComponentModel]], NHibernate "
我不知道为什么当我有NHibernate转换器,但它给了我一个我可以看看。
我从来没有发现到底是什么错了,但我碰巧遇到了这个配置,当我玩它,它的工作。
jsonSerializerSettings = new JsonSerializerSettings()
{
ReferenceLoopHandling = ReferenceLoopHandling.Serialize,
PreserveReferencesHandling = PreserveReferencesHandling.Objects,
ContractResolver = new NHibernateContractResolver(),
NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore,
TypeNameHandling = TypeNameHandling.Objects,
//TypeNameAssemblyFormat = System.Runtime.Serialization.Formatters.FormatterAssemblyStyle.Simple,
ObjectCreationHandling = ObjectCreationHandling.Replace
};
NHibernateContractResolver类:
public class NHibernateContractResolver : DefaultContractResolver
{
protected override JsonContract CreateContract(Type objectType)
{
if (typeof(INHibernateProxy).IsAssignableFrom(objectType))
return base.CreateContract(objectType.BaseType);
else
return base.CreateContract(objectType);
}
}