Skip to content

Commit 52903dc

Browse files
authored
CSHARP-5456: BsonGuidRepresentation does not work with Nullable (#1591)
1 parent 836aa60 commit 52903dc

File tree

4 files changed

+50
-18
lines changed

4 files changed

+50
-18
lines changed

src/MongoDB.Bson/Serialization/Attributes/BsonDateOnlyOptionsAttribute.cs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -61,10 +61,12 @@ public BsonDateOnlyOptionsAttribute(BsonType representation, DateOnlyDocumentFor
6161
/// <returns>A reconfigured serializer.</returns>
6262
protected override IBsonSerializer Apply(IBsonSerializer serializer)
6363
{
64-
return SerializerConfigurator.ReconfigureSerializerRecursively(serializer, Reconfigure) ?? base.Apply(serializer);
64+
if (serializer is DateOnlySerializer dateOnlySerializer)
65+
{
66+
return dateOnlySerializer.WithRepresentation(_representation, _documentFormat);
67+
}
6568

66-
IBsonSerializer Reconfigure(IBsonSerializer s)
67-
=> s is DateOnlySerializer dos ? dos.WithRepresentation(_representation, _documentFormat) : null;
69+
return base.Apply(serializer);
6870
}
6971
}
7072
#endif

src/MongoDB.Bson/Serialization/Attributes/BsonGuidRepresentationAttribute.cs

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ namespace MongoDB.Bson.Serialization.Attributes
2222
/// Specifies the Guid representation to use with the GuidSerializer for this member.
2323
/// </summary>
2424
[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field)]
25-
public class BsonGuidRepresentationAttribute : Attribute, IBsonMemberMapAttribute
25+
public class BsonGuidRepresentationAttribute : BsonSerializationOptionsAttribute
2626
{
2727
// private fields
2828
private readonly GuidRepresentation _guidRepresentation;
@@ -46,17 +46,16 @@ public GuidRepresentation GuidRepresentation
4646
get { return _guidRepresentation; }
4747
}
4848

49-
// public methods
49+
// protected methods
5050
/// <inheritdoc/>
51-
public void Apply(BsonMemberMap memberMap)
51+
protected override IBsonSerializer Apply(IBsonSerializer serializer)
5252
{
53-
var guidSerializer = memberMap.GetSerializer() as GuidSerializer;
54-
if (guidSerializer == null)
53+
if (serializer is GuidSerializer guidSerializer)
5554
{
56-
throw new InvalidOperationException("[BsonGuidRepresentationAttribute] can only be used when the serializer is a GuidSerializer.");
55+
return guidSerializer.WithGuidRepresentation(_guidRepresentation);
5756
}
58-
var reconfiguredGuidSerializer = guidSerializer.WithGuidRepresentation(_guidRepresentation);
59-
memberMap.SetSerializer(reconfiguredGuidSerializer);
57+
58+
return base.Apply(serializer);
6059
}
6160
}
6261
}

src/MongoDB.Bson/Serialization/Attributes/BsonSerializationOptionsAttribute.cs

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -52,18 +52,16 @@ public virtual void Apply(BsonMemberMap memberMap)
5252
protected virtual IBsonSerializer Apply(IBsonSerializer serializer)
5353
{
5454
// if none of the overrides applied the attribute to the serializer see if it can be applied to a child serializer
55-
var childSerializerConfigurable = serializer as IChildSerializerConfigurable;
56-
if (childSerializerConfigurable != null)
55+
if (serializer is IChildSerializerConfigurable childSerializerConfigurable)
5756
{
5857
var childSerializer = childSerializerConfigurable.ChildSerializer;
5958
var reconfiguredChildSerializer = Apply(childSerializer);
6059
return childSerializerConfigurable.WithChildSerializer(reconfiguredChildSerializer);
6160
}
6261

63-
var message = string.Format(
64-
"A serializer of type '{0}' is not configurable using an attribute of type '{1}'.",
65-
BsonUtils.GetFriendlyTypeName(serializer.GetType()),
66-
BsonUtils.GetFriendlyTypeName(this.GetType()));
62+
var message =
63+
$"A serializer of type '{BsonUtils.GetFriendlyTypeName(serializer.GetType())}' is not configurable" +
64+
$" using an attribute of type '{BsonUtils.GetFriendlyTypeName(GetType())}'.";
6765
throw new NotSupportedException(message);
6866
}
6967
}

tests/MongoDB.Driver.Tests/Specifications/uuid/prose-tests/ImplicitEncodingTests.cs

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
using FluentAssertions;
1919
using MongoDB.Bson;
2020
using MongoDB.Bson.Serialization.Attributes;
21-
using MongoDB.Bson.TestHelpers;
2221
using Xunit;
2322

2423
namespace MongoDB.Driver.Tests.Specifications.uuid.prose_tests
@@ -114,6 +113,31 @@ public void Implicit_encoding_with_unspecified_representation_should_work_as_exp
114113
exception.Should().BeOfType<BsonSerializationException>();
115114
}
116115

116+
[Fact]
117+
public void Implicit_encoding_with_nullable_or_array_guid_should_work_as_expected()
118+
{
119+
var collection = GetCollection<ClassWithNullableAndArrayGuid>();
120+
var guid = Guid.Parse("00112233445566778899aabbccddeeff");
121+
var document = new ClassWithNullableAndArrayGuid { Id = guid, GuidArray = [guid] };
122+
123+
DropCollection(collection);
124+
collection.InsertOne(document);
125+
126+
var insertedDocument = FindSingleDocument(collection);
127+
insertedDocument.Id.Should().Be(guid);
128+
insertedDocument.GuidArray[0].Should().Be(guid);
129+
130+
var insertedDocumentAsBsonDocument = FindSingleDocumentAsBsonDocument(collection);
131+
var binaryData = (BsonBinaryData)insertedDocumentAsBsonDocument["_id"];
132+
binaryData.SubType.Should().Be(BsonBinarySubType.UuidStandard);
133+
binaryData.Bytes.Should().Equal(0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb,
134+
0xcc, 0xdd, 0xee, 0xff);
135+
var binaryData2 = (BsonBinaryData)((BsonArray)insertedDocumentAsBsonDocument["GuidArray"])[0];
136+
binaryData2.SubType.Should().Be(BsonBinarySubType.UuidStandard);
137+
binaryData2.Bytes.Should().Equal(0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb,
138+
0xcc, 0xdd, 0xee, 0xff);
139+
}
140+
117141
// private methods
118142
private void DropCollection<TDocument>(IMongoCollection<TDocument> collection)
119143
{
@@ -171,5 +195,14 @@ private class ClassWithGuidIdUsingUnspecifiedRepresentation
171195
[BsonGuidRepresentation(GuidRepresentation.Unspecified)]
172196
public Guid Id { get; set; }
173197
}
198+
199+
private class ClassWithNullableAndArrayGuid
200+
{
201+
[BsonGuidRepresentation(GuidRepresentation.Standard)]
202+
public Guid? Id { get; set; }
203+
204+
[BsonGuidRepresentation(GuidRepresentation.Standard)]
205+
public Guid[] GuidArray { get; set; }
206+
}
174207
}
175208
}

0 commit comments

Comments
 (0)