我无法序列化然后立即反序列化大型对象而没有问题。 我遵循以下建议: JSON.NET and nHibernate Lazy Loading of Collections 和 JSON.Net Serialization of NHibernate Proxies (NH 3.3.2.4000)让Json.Net使用我的遗留系统。 尽管尝试了这些建议并且在各种组合中我都没有成功。以下是对我来说最有意义的设置,因为我理解它们。
转换器:
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);
我还有另外一个SO问题可能值得注意:JSON.net null property 虽然你会在上一篇评论中看到,但我相信我已经解决了它。我只是在等待解决这个问题,以确认另一个是固定的,而不是简单地埋没/替换为这个新错误。
Fluent NHibernate 1.4.0.0
NHibernate 3.3.1.4000
Netwonsoft.Json 6.0.0.0
修改
我的例外是:
未处理的类型异常 &#39; NHibernate.LazyInitializationException&#39;发生在 Newtonsoft.Json.dll
其他信息:正在初始化[Unavailable#] - 懒得不能 初始化集合,没有关闭会话或会话
我实际上发现这个埋藏在我的JSON中:
$ type: &#34; NHibernate.Collection.Generic.PersistentGenericBag`1 [[ComponentModel.Role, ComponentModel]],NHibernate&#34;
我不知道为什么当我有NHibernate转换器但它给了我一个领导我可以调查。如果我找到任何东西,我会回复。
答案 0 :(得分:1)
我从来没有发现到底出了什么问题,但是当我正在使用它时,我发生了这个配置并且它有效。
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);
}
}