11using System ;
22using System . Collections . Generic ;
3+ using System . Runtime . Serialization ;
34using NHibernate . Util ;
45
56namespace NHibernate . Tuple
67{
78 /// <summary> Centralizes handling of <see cref="EntityMode"/> to <see cref="ITuplizer"/> mappings. </summary>
89 [ Serializable ]
9- public abstract class EntityModeToTuplizerMapping
10+ public abstract class EntityModeToTuplizerMapping : IDeserializationCallback
1011 {
12+
1113 // NH-1660
1214 private readonly IDictionary < EntityMode , ITuplizer > tuplizers
1315 = new LinkedHashMap < EntityMode , ITuplizer > ( 5 , new EntityModeEqualityComparer ( ) ) ;
16+ [ NonSerialized ( ) ]
17+ private bool isFullyDeserialized = false ;
18+
19+ public EntityModeToTuplizerMapping ( )
20+ {
21+ isFullyDeserialized = true ;
22+ }
1423
1524 protected internal void AddTuplizer ( EntityMode entityMode , ITuplizer tuplizer )
1625 {
26+ EnsureFullyDeserialized ( ) ;
1727 tuplizers [ entityMode ] = tuplizer ;
1828 }
1929
@@ -22,6 +32,7 @@ protected internal void AddTuplizer(EntityMode entityMode, ITuplizer tuplizer)
2232 /// <returns> The guessed entity mode. </returns>
2333 public virtual EntityMode ? GuessEntityMode ( object obj )
2434 {
35+ EnsureFullyDeserialized ( ) ;
2536 foreach ( KeyValuePair < EntityMode , ITuplizer > entry in tuplizers )
2637 {
2738 ITuplizer tuplizer = entry . Value ;
@@ -41,6 +52,7 @@ protected internal void AddTuplizer(EntityMode entityMode, ITuplizer tuplizer)
4152 /// <returns> The tuplizer, or null if not found. </returns>
4253 public virtual ITuplizer GetTuplizerOrNull ( EntityMode entityMode )
4354 {
55+ EnsureFullyDeserialized ( ) ;
4456 ITuplizer result ;
4557 tuplizers . TryGetValue ( entityMode , out result ) ;
4658 return result ;
@@ -65,5 +77,19 @@ public virtual ITuplizer GetTuplizer(EntityMode entityMode)
6577 }
6678 return tuplizer ;
6779 }
80+
81+ private void EnsureFullyDeserialized ( )
82+ {
83+ if ( ! isFullyDeserialized )
84+ {
85+ ( ( IDeserializationCallback ) this ) . OnDeserialization ( this ) ;
86+ }
87+ }
88+
89+ void IDeserializationCallback . OnDeserialization ( object sender )
90+ {
91+ ( ( IDeserializationCallback ) tuplizers ) . OnDeserialization ( sender ) ;
92+ isFullyDeserialized = true ;
93+ }
6894 }
6995}
0 commit comments