Newtonsoft.Json.dll 中发生 NHibernate.LazyInitializationException

DBH*_*BHC 1 c# fluent-nhibernate json.net

我无法序列化然后立即反序列化大对象而不会出现问题。我遵循以下建议: JSON.NET 和 nHibernate 集合延迟加载 和 JSON.Net NHibernate 代理序列化 (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);
    }
}
Run Code Online (Sandbox Code Playgroud)

主要代码:

    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);
Run Code Online (Sandbox Code Playgroud)

我还有另一个开放的问题,可能值得注意:JSON.net null property 尽管正如您将在最后一条评论中看到的那样,我相信我已经解决了它。我只是在等待解决这个问题,以确认另一个问题已修复,而不是简单地被这个新错误埋葬/替换。

流畅的 NHibernate 1.4.0.0

NHibernate 3.3.1.4000

Netwonsoft.Json 6.0.0.0

编辑:

我的例外是:

Newtonsoft.Json.dll 中发生“NHibernate.LazyInitializationException”类型的未处理异常

附加信息:Initializing[Unavailable#] - 无法延迟初始化集合,没有会话或会话被关闭

我实际上发现它隐藏在我的 JSON 中:

$类型:“NHibernate.Collection.Generic.PersistentGenericBag`1[[ComponentModel.Role,ComponentModel]],NHibernate”

我不知道为什么当我有 NHibernate 转换器时,但它给了我一个可以研究的线索。如果我发现任何东西,我会回复。

DBH*_*BHC 5

我从来没有确切地发现出了什么问题,但当我玩它时我遇到了这个配置并且它起作用了。

    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
    };
Run Code Online (Sandbox Code Playgroud)

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);
    }
}
Run Code Online (Sandbox Code Playgroud)