【问题标题】:NHibernate.LazyInitializationException occurred in Newtonsoft.Json.dllNHibernate.LazyInitializationException 发生在 Newtonsoft.Json.dll
【发布时间】:2014-06-18 22:04:19
【问题描述】:

我无法序列化然后立即反序列化一个大对象而不会出现问题。 我听从了以下建议: JSON.NET and nHibernate Lazy Loading of CollectionsJSON.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


【解决方案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);
    }
}

【讨论】:

  • 我认为不需要ObjectCreationHandling = ObjectCreationHandling.Replace ObjectCreationHandling.Auto 可能会更好,但这为我节省了大量时间。谢谢。
  • 你成就了我的一天!谢谢!
猜你喜欢
  • 1970-01-01
  • 2020-09-13
  • 1970-01-01
  • 2014-03-06
  • 1970-01-01
  • 2017-01-13
  • 2018-06-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多