gpt4 book ai didi

nhibernate - NHibernate 代理的 JSON.Net 序列化 (NH 3.3.2.4000)

转载 作者:行者123 更新时间:2023-12-04 01:43:16 25 4
gpt4 key购买 nike

我仍然很难让 Json.Net 和 NHibernate 一起玩得很好。即,让 Json.NET 序列化代理的 NHibernate 对象。

我已遵循建议 here ,对于接受的答案和修正案,但没有骰子。

上述解决方案的最大问题是,现代版本的 NHibernate 似乎正在使用 INHibernateProxyProxy创建代理的接口(interface)(而不是INHibernateProxy?还有其他人可以确认吗?),在我的例子中,它的基类是NHibernate.Proxy.DynamicProxy.ProxyDummy ,当我尝试使用我的自定义 scontract 解析器创建 Json 合约时,它没有显示任何关于底层对象的信息,即:

    protected override JsonContract CreateContract(Type objectType)
{
if (typeof(NHibernate.Proxy.INHibernateProxy).IsAssignableFrom(objectType))
return base.CreateContract(objectType.BaseType);
else
return base.CreateContract(objectType);
}

有人对如何处理 INHibernateProxyProxy 有任何建议吗?有效地?

最佳答案

完整的解决方案:

在 Global.asax.cs 中:

 //Define Formatters
var formatters = GlobalConfiguration.Configuration.Formatters;
var jsonFormatter = formatters.JsonFormatter;
var settings = jsonFormatter.SerializerSettings;
settings.Formatting = Formatting.Indented;
jsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Serialize;
jsonFormatter.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.Objects;
jsonFormatter.SerializerSettings.ContractResolver = new NHibernateContractResolver();
//------------//

和自定义契约(Contract):
public class NHibernateContractResolver : DefaultContractResolver
{
private static readonly MemberInfo[] NHibernateProxyInterfaceMembers = typeof(INHibernateProxy).GetMembers();

protected override List<MemberInfo> GetSerializableMembers(Type objectType)
{
var members = base.GetSerializableMembers(objectType);

members.RemoveAll(memberInfo =>
(IsMemberPartOfNHibernateProxyInterface(memberInfo)) ||
(IsMemberDynamicProxyMixin(memberInfo)) ||
(IsMemberMarkedWithIgnoreAttribute(memberInfo, objectType)) ||
(IsMemberInheritedFromProxySuperclass(memberInfo, objectType)));

var actualMemberInfos = new List<MemberInfo>();

foreach (var memberInfo in members)
{
var infos = memberInfo.DeclaringType.BaseType.GetMember(memberInfo.Name);
actualMemberInfos.Add(infos.Length == 0 ? memberInfo : infos[0]);
}

return actualMemberInfos;
}

private static bool IsMemberDynamicProxyMixin(MemberInfo memberInfo)
{
return memberInfo.Name == "__interceptors";
}

private static bool IsMemberInheritedFromProxySuperclass(MemberInfo memberInfo, Type objectType)
{
return memberInfo.DeclaringType.Assembly == typeof(INHibernateProxy).Assembly;
}

private static bool IsMemberMarkedWithIgnoreAttribute(MemberInfo memberInfo, Type objectType)
{
var infos = typeof(INHibernateProxy).IsAssignableFrom(objectType)
? objectType.BaseType.GetMember(memberInfo.Name)
: objectType.GetMember(memberInfo.Name);

return infos[0].GetCustomAttributes(typeof(JsonIgnoreAttribute), true).Length > 0;
}

private static bool IsMemberPartOfNHibernateProxyInterface(MemberInfo memberInfo)
{
return Array.Exists(NHibernateProxyInterfaceMembers, mi => memberInfo.Name == mi.Name);
}


protected override JsonContract CreateContract(Type objectType)
{
if (typeof(INHibernateProxy).IsAssignableFrom(objectType))
{
var oType = objectType.GetInterfaces().FirstOrDefault(i => i.FullName.StartsWith("Your.Domain.Namespace"));
return oType != null ? base.CreateContract(oType) : base.CreateContract(objectType.BaseType);
}
return base.CreateContract(objectType);
}

不要忘记替换:“Your.Domain.Namespace”

关于nhibernate - NHibernate 代理的 JSON.Net 序列化 (NH 3.3.2.4000),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18208357/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com