Skip to content

Commit a3afabb

Browse files
committed
Fixed discriminator method
1 parent f845894 commit a3afabb

File tree

8 files changed

+58
-23
lines changed

8 files changed

+58
-23
lines changed

src/MongoDB.Bson/Serialization/BsonClassMap.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,14 @@ public IEnumerable<BsonCreatorMap> CreatorMaps
117117
get { return _creatorMaps; }
118118
}
119119

120+
/// <summary>
121+
/// Gets the conventions used for auto mapping.
122+
/// </summary>
123+
public IConventionPack ConventionPack
124+
{
125+
get { return BsonSerializer.DefaultSerializationDomain.ConventionRegistry.Lookup(_classType); } //TODO This is not completely correct, this should be eliminated.
126+
}
127+
120128
/// <summary>
121129
/// Gets the declared member maps (only for members declared in this class).
122130
/// </summary>

src/MongoDB.Bson/Serialization/Conventions/HierarchicalDiscriminatorConvention.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ namespace MongoDB.Bson.Serialization.Conventions
2222
/// <summary>
2323
/// Represents a discriminator convention where the discriminator is an array of all the discriminators provided by the class maps of the root class down to the actual type.
2424
/// </summary>
25-
public class HierarchicalDiscriminatorConvention : StandardDiscriminatorConvention, IHierarchicalDiscriminatorConvention
25+
public class HierarchicalDiscriminatorConvention : StandardDiscriminatorConvention, IHierarchicalDiscriminatorConvention, IDiscriminatorConventionInternal
2626
{
2727
// constructors
2828
/// <summary>
@@ -45,7 +45,7 @@ public override BsonValue GetDiscriminator(Type nominalType, Type actualType) =>
4545
GetDiscriminator(nominalType, actualType, BsonSerializer.DefaultSerializationDomain);
4646

4747
/// <inheritdoc />
48-
public override BsonValue GetDiscriminator(Type nominalType, Type actualType, IBsonSerializationDomain domain)
48+
public BsonValue GetDiscriminator(Type nominalType, Type actualType, IBsonSerializationDomain domain)
4949
{
5050
// TODO: this isn't quite right, not all classes are serialized using a class map serializer
5151
var classMap = domain.BsonClassMap.LookupClassMap(actualType);

src/MongoDB.Bson/Serialization/Conventions/IDiscriminatorConvention.cs

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,17 @@ public interface IDiscriminatorConvention
3636
/// <returns>The actual type.</returns>
3737
Type GetActualType(IBsonReader bsonReader, Type nominalType);
3838

39+
/// <summary>
40+
/// Gets the discriminator value for an actual type.
41+
/// </summary>
42+
/// <param name="nominalType">The nominal type.</param>
43+
/// <param name="actualType">The actual type.</param>
44+
/// <returns>The discriminator value.</returns>
45+
BsonValue GetDiscriminator(Type nominalType, Type actualType);
46+
}
47+
48+
internal interface IDiscriminatorConventionInternal : IDiscriminatorConvention
49+
{
3950
/// <summary>
4051
/// //TODO
4152
/// </summary>
@@ -45,14 +56,6 @@ public interface IDiscriminatorConvention
4556
/// <returns></returns>
4657
Type GetActualType(IBsonReader bsonReader, Type nominalType, IBsonSerializationDomain domain);
4758

48-
/// <summary>
49-
/// Gets the discriminator value for an actual type.
50-
/// </summary>
51-
/// <param name="nominalType">The nominal type.</param>
52-
/// <param name="actualType">The actual type.</param>
53-
/// <returns>The discriminator value.</returns>
54-
BsonValue GetDiscriminator(Type nominalType, Type actualType);
55-
5659
/// <summary>
5760
/// //TODO
5861
/// </summary>

src/MongoDB.Bson/Serialization/Conventions/ScalarDiscriminatorConvention.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ namespace MongoDB.Bson.Serialization.Conventions
2121
/// <summary>
2222
/// Represents a discriminator convention where the discriminator is provided by the class map of the actual type.
2323
/// </summary>
24-
public class ScalarDiscriminatorConvention : StandardDiscriminatorConvention, IScalarDiscriminatorConvention
24+
public class ScalarDiscriminatorConvention : StandardDiscriminatorConvention, IScalarDiscriminatorConvention, IDiscriminatorConventionInternal
2525
{
2626
private readonly ConcurrentDictionary<Type, BsonValue[]> _cachedTypeAndSubTypeDiscriminators = new();
2727

@@ -46,7 +46,7 @@ public override BsonValue GetDiscriminator(Type nominalType, Type actualType) =>
4646
GetDiscriminator(nominalType, actualType, BsonSerializer.DefaultSerializationDomain); //TODO method should not be used, remove it in the future
4747

4848
/// <inheritdoc />
49-
public override BsonValue GetDiscriminator(Type nominalType, Type actualType, IBsonSerializationDomain domain)
49+
public BsonValue GetDiscriminator(Type nominalType, Type actualType, IBsonSerializationDomain domain)
5050
{
5151
// TODO: this isn't quite right, not all classes are serialized using a class map serializer
5252
var classMap = domain.BsonClassMap.LookupClassMap(actualType);

src/MongoDB.Bson/Serialization/Conventions/StandardDiscriminatorConvention.cs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -95,10 +95,11 @@ obj is StandardDiscriminatorConvention other &&
9595
/// <param name="bsonReader">The reader.</param>
9696
/// <param name="nominalType">The nominal type.</param>
9797
/// <returns>The actual type.</returns>
98-
public Type GetActualType(IBsonReader bsonReader, Type nominalType) =>
98+
public Type GetActualType(IBsonReader bsonReader, Type nominalType) => //TODO This one should not be used
9999
GetActualType(bsonReader, nominalType, BsonSerializer.DefaultSerializationDomain);
100100

101101
/// <inheritdoc />
102+
/// TODO
102103
public Type GetActualType(IBsonReader bsonReader, Type nominalType, IBsonSerializationDomain domain)
103104
{
104105
// the BsonReader is sitting at the value whose actual type needs to be found
@@ -140,9 +141,6 @@ public Type GetActualType(IBsonReader bsonReader, Type nominalType, IBsonSeriali
140141
/// <returns>The discriminator value.</returns>
141142
public abstract BsonValue GetDiscriminator(Type nominalType, Type actualType);
142143

143-
/// <inheritdoc/>
144-
public abstract BsonValue GetDiscriminator(Type nominalType, Type actualType, IBsonSerializationDomain domain);
145-
146144
/// <inheritdoc/>
147145
public override int GetHashCode() => 0;
148146
}

src/MongoDB.Bson/Serialization/Serializers/BsonClassMapSerializer.cs

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,17 @@ public override TClass Deserialize(BsonDeserializationContext context, BsonDeser
9090

9191
var discriminatorConvention = _classMap.GetDiscriminatorConvention(context.SerializationDomain as IBsonSerializationDomainInternal);
9292

93-
var actualType = discriminatorConvention.GetActualType(bsonReader, args.NominalType);
93+
Type actualType;
94+
95+
if (discriminatorConvention is IDiscriminatorConventionInternal discriminatorConventionInternal)
96+
{
97+
actualType = discriminatorConventionInternal.GetActualType(bsonReader, args.NominalType, context.SerializationDomain);
98+
}
99+
else
100+
{
101+
actualType = discriminatorConvention.GetActualType(bsonReader, args.NominalType);
102+
}
103+
94104
if (actualType == typeof(TClass))
95105
{
96106
return DeserializeClass(context);
@@ -646,7 +656,17 @@ private void SerializeDiscriminator(BsonSerializationContext context, Type nomin
646656
if (discriminatorConvention != null)
647657
{
648658
var actualType = obj.GetType();
649-
var discriminator = discriminatorConvention.GetDiscriminator(nominalType, actualType, context.SerializationDomain);
659+
660+
BsonValue discriminator;
661+
if (discriminatorConvention is IDiscriminatorConventionInternal discriminatorConventionInternal)
662+
{
663+
discriminator = discriminatorConventionInternal.GetDiscriminator(nominalType, actualType, context.SerializationDomain);
664+
}
665+
else
666+
{
667+
discriminator = discriminatorConvention.GetDiscriminator(nominalType, actualType);
668+
}
669+
650670
if (discriminator != null)
651671
{
652672
context.Writer.WriteName(discriminatorConvention.ElementName);

src/MongoDB.Bson/Serialization/Serializers/ObjectSerializer.cs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -364,7 +364,17 @@ private object DeserializeDiscriminatedValue(BsonDeserializationContext context,
364364
{
365365
var bsonReader = context.Reader;
366366

367-
var actualType = _discriminatorConvention.GetActualType(bsonReader, typeof(object));
367+
Type actualType;
368+
369+
if (_discriminatorConvention is IDiscriminatorConventionInternal discriminatorConventionInternal)
370+
{
371+
actualType = discriminatorConventionInternal.GetActualType(bsonReader, args.NominalType, context.SerializationDomain); //TODO I think these type of things could become an internal extension methods
372+
}
373+
else
374+
{
375+
actualType = _discriminatorConvention.GetActualType(bsonReader, args.NominalType);
376+
}
377+
368378
if (!_allowedDeserializationTypes(actualType))
369379
{
370380
throw new BsonSerializationException($"Type {actualType.FullName} is not configured as a type that is allowed to be deserialized for this instance of ObjectSerializer.");

tests/MongoDB.Bson.Tests/Serialization/Conventions/StandardDiscriminatorConventionTests.cs

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -117,10 +117,6 @@ public ConcreteStandardDiscriminatorConvention(string elementName)
117117
}
118118

119119
public override BsonValue GetDiscriminator(Type nominalType, Type actualType) => throw new NotImplementedException();
120-
public override BsonValue GetDiscriminator(Type nominalType, Type actualType, IBsonSerializationDomain domain)
121-
{
122-
throw new NotImplementedException();
123-
}
124120
}
125121

126122
public class DerivedFromConcreteStandardDiscriminatorConvention : ConcreteStandardDiscriminatorConvention

0 commit comments

Comments
 (0)