Skip to content

Commit 1711b5c

Browse files
bahusoidhazzik
authored andcommitted
Obsolete IDeserializationCallback from EntityKey (nhibernate#1977)
1 parent 14c5cdb commit 1711b5c

File tree

1 file changed

+13
-19
lines changed

1 file changed

+13
-19
lines changed

src/NHibernate/Engine/EntityKey.cs

Lines changed: 13 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@
33
using System.Security;
44
using NHibernate.Impl;
55
using NHibernate.Persister.Entity;
6-
using NHibernate.Type;
76

87
namespace 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

Comments
 (0)