问题描述
这是我在课堂上使用的一段代码 protected override 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;
};
}
prop.GetValue(instance,null);因代理错误而失败,我可以在不触及对象的数据结构的情况下在此级别进行干预吗?
我曾尝试将 ReferenceLoopHandling 设置为忽略,但收效甚微。
解决方法
根据您的想法,我能够解决我的代理对象问题,如下所示:
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;
}