33using System . Security ;
44using NHibernate . Impl ;
55using NHibernate . Persister . Entity ;
6- using NHibernate . Type ;
76
87namespace NHibernate . Engine
98{
9+ //TODO 6.0: Remove IDeserializationCallback interface
1010 /// <summary>
1111 /// A globally unique identifier of an instance, consisting of the user-visible identifier
1212 /// and the identifier space (eg. tablename)
@@ -17,15 +17,14 @@ public sealed class EntityKey : IDeserializationCallback, ISerializable, IEquata
1717 private readonly object identifier ;
1818 private readonly IEntityPersister _persister ;
1919 // hashcode may vary among processes, they cannot be stored and have to be re-computed after deserialization
20- [ NonSerialized ]
21- private int ? _hashCode ;
20+ private readonly int _hashCode ;
2221
2322 /// <summary> Construct a unique identifier for an entity class instance</summary>
2423 public EntityKey ( object id , IEntityPersister persister )
2524 {
2625 identifier = id ?? throw new AssertionFailure ( "null identifier" ) ;
2726 _persister = persister ;
28- _hashCode = GenerateHashCode ( ) ;
27+ _hashCode = GenerateHashCode ( persister , id ) ;
2928 }
3029
3130 private EntityKey ( SerializationInfo info , StreamingContext context )
@@ -34,6 +33,7 @@ private EntityKey(SerializationInfo info, StreamingContext context)
3433 var factory = ( ISessionFactoryImplementor ) info . GetValue ( nameof ( _persister . Factory ) , typeof ( ISessionFactoryImplementor ) ) ;
3534 var entityName = ( string ) info . GetValue ( nameof ( EntityName ) , typeof ( string ) ) ;
3635 _persister = factory . GetEntityPersister ( entityName ) ;
36+ _hashCode = GenerateHashCode ( _persister , identifier ) ;
3737 }
3838
3939 public bool IsBatchLoadable => _persister . IsBatchLoadable ;
@@ -66,26 +66,16 @@ public bool Equals(EntityKey other)
6666
6767 public override int GetHashCode ( )
6868 {
69- // If the object is put in a set or dictionary during deserialization, the hashcode will not yet be
70- // computed. Compute the hashcode on the fly. So long as this happens only during deserialization, there
71- // will be no thread safety issues. For the hashcode to be always defined after deserialization, the
72- // deserialization callback is used.
73- return _hashCode ?? GenerateHashCode ( ) ;
69+ return _hashCode ;
7470 }
7571
76- /// <inheritdoc />
77- public void OnDeserialization ( object sender )
78- {
79- _hashCode = GenerateHashCode ( ) ;
80- }
81-
82- private int GenerateHashCode ( )
72+ private static int GenerateHashCode ( IEntityPersister persister , object id )
8373 {
8474 int result = 17 ;
8575 unchecked
8676 {
87- result = 37 * result + RootEntityName . GetHashCode ( ) ;
88- result = 37 * result + _persister . IdentifierType . GetHashCode ( identifier , _persister . Factory ) ;
77+ result = 37 * result + persister . RootEntityName . GetHashCode ( ) ;
78+ result = 37 * result + persister . IdentifierType . GetHashCode ( id , persister . Factory ) ;
8979 }
9080 return result ;
9181 }
@@ -96,11 +86,15 @@ public override string ToString()
9686 }
9787
9888 [ SecurityCritical ]
99- public void GetObjectData ( SerializationInfo info , StreamingContext context )
89+ void ISerializable . GetObjectData ( SerializationInfo info , StreamingContext context )
10090 {
10191 info . AddValue ( nameof ( Identifier ) , identifier ) ;
10292 info . AddValue ( nameof ( _persister . Factory ) , _persister . Factory ) ;
10393 info . AddValue ( nameof ( EntityName ) , EntityName ) ;
10494 }
95+
96+ [ Obsolete ( "IDeserializationCallback interface has no usages and will be removed in a future version" ) ]
97+ public void OnDeserialization ( object sender )
98+ { }
10599 }
106100}
0 commit comments