| From | Sent On | Attachments |
|---|---|---|
| Jimmy Shimizu | Aug 12, 2008 8:57 am | |
| Lee Henson | Aug 12, 2008 1:58 pm |
| Subject: | Re: proxyobjects looses it's attributes? | |
|---|---|---|
| From: | Lee Henson (lee....@gmail.com) | |
| Date: | Aug 12, 2008 1:58:11 pm | |
| List: | com.googlegroups.castle-project-users | |
Hi
I'm assuming you're using Newtonsoft Json.Net? Here's what I've been using for a while:
1) Create your own custom json serializer:
public class NHibernateProxyJsonSerializer : JsonSerializer { 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 IsMemberPartOfNHibernateProxyInterface(MemberInfo memberInfo) { return Array.Exists(NHibernateProxyInterfaceMembers, mi => memberInfo.Name == mi.Name); }
private static bool IsMemberDynamicProxyMixin(MemberInfo memberInfo) { return memberInfo.Name == "__interceptors"; }
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 IsMemberInheritedFromProxySuperclass(MemberInfo memberInfo, Type objectType) { return memberInfo.DeclaringType != objectType; } }
2) Create your own converter:
public class NHibernateProxyJsonConverter : JsonConverter { public override bool CanConvert(Type objectType) { return typeof(INHibernateProxy).IsAssignableFrom(objectType); }
public override void WriteJson(JsonWriter writer, object value) { new NHibernateProxyJsonSerializer().Serialize(writer, value); }
public override object ReadJson(JsonReader reader, Type objectType) { throw new NotImplementedException(); } }
3) Use the converter when you attempt to convert an object to Json (notepad code below):
JavaScriptConvert.SerializeObject( object, new JsonConverterCollection { new NHibernateProxyJsonConverter() } )
2008/8/12 Jimmy Shimizu <jimm...@gmail.com>
Hi, I have problems with Entities which is specified with Lazy = true, which I have [JsonIgnore] attributes on. Seems like they drop attributes therefor making them unserializable (self referencing loop).
debugging the app shows me that it's an array of proxy-objects that I'm trying to serialize, instead of an array of my entity. In some cases I don't get proxyobjects, and I'm not sure what triggers it.
Is this wanted behaviour? Can I somehow prevent lazy loading the class from some points, or convert them back to the original entity?





