【发布时间】:2014-06-18 22:04:19
【问题描述】:
我无法序列化然后立即反序列化一个大对象而不会出现问题。 我听从了以下建议: 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 尽管正如您将在最后一条评论中看到的那样,我相信我已经解决了它。我只是在等待解决这个问题,以确认另一个问题已修复,而不是简单地被这个新错误掩埋/替换。
流畅的 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 lazily 初始化一个集合,没有会话或会话被关闭
我实际上发现它隐藏在我的 JSON 中:
$类型: “NHibernate.Collection.Generic.PersistentGenericBag`1[[ComponentModel.Role, ComponentModel]], NHibernate"
我不知道为什么当我有 NHibernate 转换器时,但它给了我一个可以调查的线索。如果我发现了什么,我会回帖。
【问题讨论】:
-
您的问题中的细节太少,无法找出问题所在。您能发布异常详细信息吗?
-
嗨,米卡莱。巧合的是,我今天刚刚回到这个问题,并能够找到更多信息 - 请参阅我的编辑。我希望我的转换器只需要以某种方式进行调整,以处理我猜想从 NHibernate 代理解析的集合。
-
我有一种直觉,你正在做一些危险的事情...... NHibernateContractResolver 的代码是什么?
-
其实我认为这本质上是不正确的——你应该对NH在幕后所做的事情有很好的了解。也没有简单的方法可以避免延迟加载。我有一个总是有效的建议,但有它的价格。 方法是:您创建一个“模型”类并将您的“数据”类映射到它们(例如使用 Automapper)。然后您可以轻松地序列化“模型”类。而且您可以完全控制它们的内部结构,并且将来不会遇到此类问题,或者能够轻松解决它们。
-
如果我理解正确的话,我实际上早就考虑过这样做,但认为这是不好的做法——即不必要的步骤。但是,我仍然不确定。如果我在解析之前强制加载我的所有集合,它不应该按计划工作吗?事实上,这本质上不是你的模型想法会做什么吗?还是您认为关键在于剥离行为以拥有仅数据对象? p.s 我的第一个代码 sn-p 是我的 NHibernateContractResolver
标签: c# fluent-nhibernate json.net