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
12- private readonly IDictionary < EntityMode , ITuplizer > tuplizers
13- = new LinkedHashMap < EntityMode , ITuplizer > ( 5 , new EntityModeEqualityComparer ( ) ) ;
14+ private readonly IDictionary < EntityMode , ITuplizer > _tuplizers
15+ = new LinkedHashMap < EntityMode , ITuplizer > ( 5 , new EntityModeEqualityComparer ( ) ) ;
16+
17+ /// <summary>
18+ /// This class might get called during serialization, and may therefore need to deserialize on-demand.
19+ /// </summary>
20+ [ NonSerialized ] private bool _isFullyDeserialized ;
21+
22+
23+ protected EntityModeToTuplizerMapping ( )
24+ {
25+ _isFullyDeserialized = true ;
26+ }
1427
1528 protected internal void AddTuplizer ( EntityMode entityMode , ITuplizer tuplizer )
1629 {
17- tuplizers [ entityMode ] = tuplizer ;
30+ EnsureFullyDeserialized ( ) ;
31+ _tuplizers [ entityMode ] = tuplizer ;
1832 }
1933
2034 /// <summary> Given a supposed instance of an entity/component, guess its entity mode. </summary>
2135 /// <param name="obj">The supposed instance of the entity/component.</param>
2236 /// <returns> The guessed entity mode. </returns>
2337 public virtual EntityMode ? GuessEntityMode ( object obj )
2438 {
25- foreach ( KeyValuePair < EntityMode , ITuplizer > entry in tuplizers )
39+ EnsureFullyDeserialized ( ) ;
40+ foreach ( KeyValuePair < EntityMode , ITuplizer > entry in _tuplizers )
2641 {
2742 ITuplizer tuplizer = entry . Value ;
2843 if ( tuplizer . IsInstance ( obj ) )
@@ -41,8 +56,9 @@ protected internal void AddTuplizer(EntityMode entityMode, ITuplizer tuplizer)
4156 /// <returns> The tuplizer, or null if not found. </returns>
4257 public virtual ITuplizer GetTuplizerOrNull ( EntityMode entityMode )
4358 {
59+ EnsureFullyDeserialized ( ) ;
4460 ITuplizer result ;
45- tuplizers . TryGetValue ( entityMode , out result ) ;
61+ _tuplizers . TryGetValue ( entityMode , out result ) ;
4662 return result ;
4763 }
4864
@@ -65,5 +81,19 @@ public virtual ITuplizer GetTuplizer(EntityMode entityMode)
6581 }
6682 return tuplizer ;
6783 }
84+
85+ private void EnsureFullyDeserialized ( )
86+ {
87+ if ( ! _isFullyDeserialized )
88+ {
89+ ( ( IDeserializationCallback ) this ) . OnDeserialization ( this ) ;
90+ }
91+ }
92+
93+ void IDeserializationCallback . OnDeserialization ( object sender )
94+ {
95+ ( ( IDeserializationCallback ) _tuplizers ) . OnDeserialization ( sender ) ;
96+ _isFullyDeserialized = true ;
97+ }
6898 }
6999}
0 commit comments