NHiberante 无法初始化代理 - 无会话

NHiberante Could not initialize proxy - no Session

提问人:Elena Lampugnani 提问时间:3/9/2021 最后编辑:Elena Lampugnani 更新时间:5/28/2021 访问量:82

问:

这是我的一段代码,我在类中使用 受保护的重写 JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization) {

检查我在对象中的属性是否可序列化

if (property.ShouldSerialize == null) {
            property.ShouldSerialize = instance => {
                try {
                    PropertyInfo prop = (PropertyInfo)member;
                    if (prop.CanRead) {
                        var value = prop.GetValue(instance, null);
                        
                        if (value != null
                            && value.GetType().IsSubclassOfRawGeneric(typeof(NHibernate.Collection.Generic.PersistentGenericBag<>))
                            && !((value as NHibernate.Collection.AbstractPersistentCollection).WasInitialized)) {
                            return false;
                        }
                        return true;
                    }
                }
                catch (Exception e) {
                    var m = e.Message;
                }
                return false;
            };
        }

支柱。GetValue(实例,null);失败并出现代理错误,我可以在不触及对象数据结构的情况下在此级别进行干预吗?

我尝试将 ReferenceLoopHandling 设置为忽略,但收效甚微。

C# 序列化 nhibernate 延迟加载 propertyinfo

评论


答:

0赞 Paulo Henrique 5/28/2021 #1

根据您的想法,我能够解决代理对象的问题,如下所示:

public class NHibernateContractResolver : DefaultContractResolver {

    protected override JsonContract CreateContract(Type objectType) {
        if (typeof(INHibernateProxy).IsAssignableFrom(objectType)) {
            return base.CreateObjectContract(objectType);
            //return base.CreateContract(objectType.BaseType);
        }
        return base.CreateContract(objectType);
    }
    protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization) {
        JsonProperty property = base.CreateProperty(member, memberSerialization);
        property.ShouldSerialize = instance => {
            {
                try {
                    PropertyInfo prop = (PropertyInfo)member;
                    if (prop.CanRead) {
                        var value = prop.GetValue(instance, null);
                        if (value != null
                        && value.GetType().Name.Equals("PersistentGenericBag`1")) {
                            var item = ((IList)value)[0];
                        }
                        return true;
                    }
                    return false;
                } catch (Exception) {
                    return false;
                }
            };
        };
        return property;
    }