在Newtonsoft.Json.dll中发生NHibernate.LazyInitializationException

时间:2014-06-05 13:23:48

标签: c# fluent-nhibernate json.net

我无法序列化然后立即反序列化大型对象而没有问题。 我遵循以下建议: 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 虽然你会在上一篇评论中看到,但我相信我已经解决了它。我只是在等待解决这个问题,以确认另一个是固定的,而不是简单地埋没/替换为这个新错误。

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转换器但它给了我一个领导我可以调查。如果我找到任何东西,我会回复。

1 个答案:

答案 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);
    }
}