Well, in my case problem occurrs "via" .NET Remoting, but I think same problem would occur if I saved serialized entity to a local file (e.g. some strange cache) and then deserialized it later in another session (from file) and tried to merge back to current session. Of course I can implement own handler executed on deserializing my entity, but I don't know how to construct proper instance of ILazyInitializer for the entity being deserialized.
Bartek On Monday, April 7, 2014 8:13:50 PM UTC+2, Ricardo Peres wrote: > > But is the problem related to .NET Remoting? If so, you can try > implementing ISerializable and doing your own serialization, which may take > into account if the property was loaded or not. > > RP > > On Monday, April 7, 2014 5:08:21 PM UTC+1, [email protected] wrote: >> >> Hi, >> >> I am involved in development of application having a bit unusual setup >> regarding use of lazy load proxies. >> The application is client/server implemented in ClickOnce technology (the >> client) and .NET remoting (communication between client and server). >> Entity classes are rather complex (several levels of relations, >> many-to-many collections, inheritance etc.) and are use both on server as >> well as at client side. >> In the old days (NH 2.0) it was a problem to use dynamic proxies in >> nhibernate because ClickOnce client wasn't able to deserialize entities >> having collections of such lazy proxies (due to security issues). >> The we invented was to implement own IProxyFactory and return manually >> constructed proxies. So, for each entity EntityX there is also a >> corresponding EnityXLazyLoadProxy which is includes dummy implementation: >> >> [Serializable] >> public class EnityXLazyLoadProxy : EntityX , INHibernateProxy >> { >> public ILazyInitializer HibernateLazyInitializer >> { >> get; >> set; >> } >> } >> >> >> >> The solution worked fine (with a limitation that lazy entities can't be >> initialized on demand, but that wasn't a concern). >> >> Recently I investigated content of serialized objects and found out that >> there is some "garbage" included which shouldn't be there, because entity >> was transmitted as LazyLoadProxy only >> (by garbage I mean e.g. real values of properties, for example very long >> strings which I would like to avoid transmitting). >> >> It turned out to be caused by the fact that HibernateLazyInitializer >> field was also serialized, with all its fields (e.g. Target). >> So, I changed it to not serialize that field: >> >> [NonSerialized] >> private ILazyInitializer _HibernateLazyInitializer; >> public ILazyInitializer HibernateLazyInitializer >> { >> get { return _HibernateLazyInitializer; } >> set { _HibernateLazyInitializer = value; } >> } >> >> >> >> This works fine (no more "garbage" in serialized stream containing >> LazyLoadProxy-ies). >> But it causes another problem: sometimes i need to send a object from >> client to server containing LazyLoadProxy-ies (previously received form >> server, of course). >> Such entity is the merged to the session server side. And this fails: >> >> MESSAGE: >> System.NullReferenceException : Object reference not set to an instance of >> an object. >> +++++++++++++++++++ >> STACK TRACE: >> >> Server stack trace: >> at NHibernate.Impl.SessionImpl.GetContextEntityIdentifier(Object obj) >> at NHibernate.Type.EntityType.Replace(Object original, Object target, >> ISessionImplementor session, Object owner, IDictionary copyCache) >> at NHibernate.Type.TypeHelper.Replace(Object[] original, Object[] target, >> IType[] types, ISessionImplementor session, Object owner, IDictionary >> copiedAlready) >> at >> NHibernate.Event.Default.DefaultMergeEventListener.CopyValues(IEntityPersister >> persister, Object entity, Object target, ISessionImplementor source, >> IDictionary copyCache) >> at >> NHibernate.Event.Default.DefaultMergeEventListener.EntityIsDetached(MergeEvent >> event, IDictionary copyCache) >> at NHibernate.Event.Default.DefaultMergeEventListener.OnMerge(MergeEvent >> event) >> at NHibernate.Impl.SessionImpl.FireMerge(MergeEvent event) >> at NHibernate.Impl.SessionImpl.Merge(String entityName, Object obj) >> at NHibernate.Impl.SessionImpl.Merge(Object obj) >> at NHibernate.Impl.SessionImpl.Merge[T](T entity) >> >> >> I've checked source of GetContextEntityIdentifier(...) and it assume that >> if object is a proxy, then HibernateLazyInitializer property should be >> there. >> >> So, I'm looking for any hint how to guarantee the >> HibernateLazyInitializer is initialized for objects deserialized at server >> side. I suppose session.Merge is not the only method that might fail in >> this case (or maybe I'm wrong?) >> Or maybe any hint how to prevent transmitting "garbage" not marking >> HibernateLazyInitializer's field as [NonSerialized]? >> >> greetings, >> Bartek >> >> -- You received this message because you are subscribed to the Google Groups "nhusers" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To post to this group, send email to [email protected]. Visit this group at http://groups.google.com/group/nhusers. For more options, visit https://groups.google.com/d/optout.
