Skip to content

Commit 27671ae

Browse files
committed
Fixed BsonDocumentWrapper and added comments
1 parent 59c3a47 commit 27671ae

File tree

10 files changed

+44
-27
lines changed

10 files changed

+44
-27
lines changed

src/MongoDB.Bson/ObjectModel/BsonDocumentWrapper.cs

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -37,14 +37,15 @@ public class BsonDocumentWrapper : MaterializedOnDemandBsonDocument
3737
// private fields
3838
private readonly object _wrapped;
3939
private readonly IBsonSerializer _serializer;
40+
private readonly IBsonSerializationDomain _serializationDomain;
4041

4142
// constructors
4243
/// <summary>
4344
/// Initializes a new instance of the <see cref="BsonDocumentWrapper"/> class.
4445
/// </summary>
4546
/// <param name="value">The value.</param>
4647
public BsonDocumentWrapper(object value)
47-
: this(value, UndiscriminatedActualTypeSerializer<object>.Instance)
48+
: this(value, UndiscriminatedActualTypeSerializer<object>.Instance, BsonSerializer.DefaultSerializationDomain)
4849
{
4950
}
5051

@@ -54,14 +55,15 @@ public BsonDocumentWrapper(object value)
5455
/// <param name="value">The value.</param>
5556
/// <param name="serializer">The serializer.</param>
5657
public BsonDocumentWrapper(object value, IBsonSerializer serializer)
58+
: this(value, serializer, BsonSerializer.DefaultSerializationDomain)
5759
{
58-
if (serializer == null)
59-
{
60-
throw new ArgumentNullException("serializer");
61-
}
60+
}
6261

62+
internal BsonDocumentWrapper(object value, IBsonSerializer serializer, IBsonSerializationDomain serializationDomain)
63+
{
64+
_serializer = serializer ?? throw new ArgumentNullException(nameof(serializer));
65+
_serializationDomain = serializationDomain;
6366
_wrapped = value;
64-
_serializer = serializer;
6567
}
6668

6769
// public properties
@@ -84,6 +86,7 @@ public object Wrapped
8486
get { return _wrapped; }
8587
}
8688

89+
// DOMAIN-API All the various Create methods are used only in testing, the version without the domain should be removed.
8790
// public static methods
8891
/// <summary>
8992
/// Creates a new instance of the BsonDocumentWrapper class.
@@ -111,7 +114,7 @@ public static BsonDocumentWrapper Create(Type nominalType, object value) =>
111114
internal static BsonDocumentWrapper Create(Type nominalType, object value, IBsonSerializationDomain domain)
112115
{
113116
var serializer = domain.LookupSerializer(nominalType);
114-
return new BsonDocumentWrapper(value, serializer);
117+
return new BsonDocumentWrapper(value, serializer, domain);
115118
}
116119

117120
/// <summary>
@@ -139,7 +142,7 @@ internal static IEnumerable<BsonDocumentWrapper> CreateMultiple<TNominalType>(IE
139142
}
140143

141144
var serializer = domain.LookupSerializer(typeof(TNominalType));
142-
return values.Select(v => new BsonDocumentWrapper(v, serializer));
145+
return values.Select(v => new BsonDocumentWrapper(v, serializer, domain));
143146
}
144147

145148
/// <summary>
@@ -171,7 +174,7 @@ internal static IEnumerable<BsonDocumentWrapper> CreateMultiple(Type nominalType
171174
}
172175

173176
var serializer = domain.LookupSerializer(nominalType);
174-
return values.Cast<object>().Select(v => new BsonDocumentWrapper(v, serializer));
177+
return values.Cast<object>().Select(v => new BsonDocumentWrapper(v, serializer, domain));
175178
}
176179

177180
// public methods
@@ -191,7 +194,8 @@ public override BsonValue Clone()
191194
{
192195
return new BsonDocumentWrapper(
193196
_wrapped,
194-
_serializer);
197+
_serializer,
198+
_serializationDomain);
195199
}
196200
}
197201

@@ -206,8 +210,7 @@ protected override IEnumerable<BsonElement> Materialize()
206210
var writerSettings = BsonDocumentWriterSettings.Defaults;
207211
using (var bsonWriter = new BsonDocumentWriter(bsonDocument, writerSettings))
208212
{
209-
//QUESTION Is it correct we only need a default domain here?
210-
var context = BsonSerializationContext.CreateRoot(bsonWriter, BsonSerializer.DefaultSerializationDomain);
213+
var context = BsonSerializationContext.CreateRoot(bsonWriter, _serializationDomain);
211214
_serializer.Serialize(context, _wrapped);
212215
}
213216

src/MongoDB.Bson/Serialization/BsonSerializationInfo.cs

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,20 @@ public Type NominalType
108108
get { return _nominalType; }
109109
}
110110

111+
/* DOMAIN-API Both DeserializeValue and SerializeValue should be changed to accept a domain as input.
112+
* DeserializeValue is only used by BsonDocumentBackedClass
113+
* SerializeValue is used by BsonDocumentBackedClass and also by GridFS buckets to serialize the Id field.
114+
*
115+
* BsonDocumentBackedClass is the base for a few classes in the driver (GridFSFileInfo, ChangeStreamPreAndPostImagesOptions, etc).
116+
* For those classes we can use the default domain, as no custom serialization is expected.
117+
*
118+
* GridFS buckets on the other hand allow the user to specify a custom Id serializer, which may require a custom domain.
119+
* But looking at the docs it seems that ObjectId is the preferred type for the Id field, and I suppose there won't need to be custom serialization.
120+
*
121+
* Thus for now I think it's acceptable to use the default domain in SerializeValue too, but we should revisit this decision at a later time.
122+
*/
123+
124+
//DOMAIN-API This method should be changed to accept a domain as input.
111125
/// <summary>
112126
/// Deserializes the value.
113127
/// </summary>
@@ -118,7 +132,6 @@ public object DeserializeValue(BsonValue value)
118132
var tempDocument = new BsonDocument("value", value);
119133
using (var reader = new BsonDocumentReader(tempDocument))
120134
{
121-
//QUESTION Is it correct we only need a default domain here?
122135
var context = BsonDeserializationContext.CreateRoot(reader, BsonSerializer.DefaultSerializationDomain);
123136
reader.ReadStartDocument();
124137
reader.ReadName("value");
@@ -145,6 +158,7 @@ obj is BsonSerializationInfo other &&
145158
/// <inheritdoc/>
146159
public override int GetHashCode() => 0;
147160

161+
//DOMAIN-API This method should be changed to accept a domain as input.
148162
/// <summary>
149163
/// Serializes the value.
150164
/// </summary>
@@ -155,7 +169,6 @@ public BsonValue SerializeValue(object value)
155169
var tempDocument = new BsonDocument();
156170
using (var bsonWriter = new BsonDocumentWriter(tempDocument))
157171
{
158-
//QUESTION Is it correct we only need a default domain here?
159172
var context = BsonSerializationContext.CreateRoot(bsonWriter, BsonSerializer.DefaultSerializationDomain);
160173
bsonWriter.WriteStartDocument();
161174
bsonWriter.WriteName("value");

src/MongoDB.Driver/Command.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -221,12 +221,13 @@ public IBsonSerializer<TResult> ResultSerializer
221221
get { return _resultSerializer; }
222222
}
223223

224+
// DOMAIN-API: We need to pass also the domain here (or only the domain)
224225
/// <inheritdoc />
225226
public override RenderedCommand<TResult> Render(IBsonSerializerRegistry serializerRegistry)
226227
{
227228
var serializer = serializerRegistry.GetSerializer(_obj.GetType());
228229
return new RenderedCommand<TResult>(
229-
new BsonDocumentWrapper(_obj, serializer),
230+
new BsonDocumentWrapper(_obj, serializer, BsonSerializer.DefaultSerializationDomain),
230231
_resultSerializer ?? serializerRegistry.GetSerializer<TResult>());
231232
}
232233
}

src/MongoDB.Driver/Core/WireProtocol/CommandUsingQueryMessageWireProtocol.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,7 @@ private BsonDocument CombineCommandWithPayloads(ConnectionDescription connection
185185
}
186186

187187
var payloadAppendingSerializer = new ElementAppendingSerializer<BsonDocument>(BsonDocumentSerializer.Instance, extraElements);
188-
return new BsonDocumentWrapper(_command, payloadAppendingSerializer);
188+
return new BsonDocumentWrapper(_command, payloadAppendingSerializer, _serializationDomain);
189189
}
190190

191191
private BsonArray CreatePayloadArray(Type1CommandMessageSection payload, ConnectionDescription connectionDescription)
@@ -200,7 +200,7 @@ private BsonArray CreatePayloadArray(Type1CommandMessageSection payload, Connect
200200
payloadSerializer = CreateFixedCountPayloadSerializer(payload);
201201
}
202202

203-
var documents = new BsonDocumentWrapper(payload.Documents, payloadSerializer);
203+
var documents = new BsonDocumentWrapper(payload.Documents, payloadSerializer, _serializationDomain);
204204
return new BsonArray { documents };
205205
}
206206

@@ -377,7 +377,7 @@ private BsonDocument WrapCommandForQueryMessage(BsonDocument command, Connection
377377
extraElements.Add(clusterTime);
378378
}
379379
var appendExtraElementsSerializer = new ElementAppendingSerializer<BsonDocument>(BsonDocumentSerializer.Instance, extraElements);
380-
var commandWithExtraElements = new BsonDocumentWrapper(command, appendExtraElementsSerializer);
380+
var commandWithExtraElements = new BsonDocumentWrapper(command, appendExtraElementsSerializer, _serializationDomain);
381381

382382
var serverType = connectionDescription != null ? connectionDescription.HelloResult.ServerType : ServerType.Unknown;
383383
var readPreferenceDocument = QueryHelper.CreateReadPreferenceDocument(serverType, _readPreference, out secondaryOk);

src/MongoDB.Driver/Core/WireProtocol/Messages/Encoders/JsonEncoders/ReplyMessageJsonEncoder.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ public void WriteMessage(ReplyMessage<TDocument> message)
104104
BsonArray documents = null;
105105
if (!message.QueryFailure)
106106
{
107-
var wrappers = message.Documents.Select(d => new BsonDocumentWrapper(d, _serializer));
107+
var wrappers = message.Documents.Select(d => new BsonDocumentWrapper(d, _serializer, _serializationDomain));
108108
documents = new BsonArray(wrappers);
109109
}
110110

src/MongoDB.Driver/FilterDefinition.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -275,7 +275,7 @@ public object Object
275275
public override BsonDocument Render(RenderArgs<TDocument> args)
276276
{
277277
var serializer = args.SerializerRegistry.GetSerializer(_obj.GetType());
278-
return new BsonDocumentWrapper(_obj, serializer);
278+
return new BsonDocumentWrapper(_obj, serializer, args.SerializationDomain);
279279
}
280280
}
281281
}

src/MongoDB.Driver/MongoCollectionImpl.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -679,7 +679,7 @@ private WriteRequest ConvertWriteModelToWriteRequest(WriteModel<TDocument> model
679679
{
680680
_documentSerializer.SetDocumentIdIfMissing(this, insertOneModel.Document, renderArgs.SerializationDomain);
681681
}
682-
return new InsertRequest(new BsonDocumentWrapper(insertOneModel.Document, _documentSerializer))
682+
return new InsertRequest(new BsonDocumentWrapper(insertOneModel.Document, _documentSerializer, renderArgs.SerializationDomain))
683683
{
684684
CorrelationId = index
685685
};
@@ -706,7 +706,7 @@ private WriteRequest ConvertWriteModelToWriteRequest(WriteModel<TDocument> model
706706
return new UpdateRequest(
707707
UpdateType.Replacement,
708708
replaceOneModel.Filter.Render(renderArgs),
709-
new BsonDocumentWrapper(replaceOneModel.Replacement, _documentSerializer))
709+
new BsonDocumentWrapper(replaceOneModel.Replacement, _documentSerializer, renderArgs.SerializationDomain))
710710
{
711711
Collation = replaceOneModel.Collation,
712712
CorrelationId = index,
@@ -1010,7 +1010,7 @@ private FindOneAndReplaceOperation<TProjection> CreateFindOneAndReplaceOperation
10101010
return new FindOneAndReplaceOperation<TProjection>(
10111011
_collectionNamespace,
10121012
filter.Render(renderArgs),
1013-
new BsonDocumentWrapper(replacement, _documentSerializer),
1013+
new BsonDocumentWrapper(replacement, _documentSerializer, renderArgs.SerializationDomain),
10141014
new FindAndModifyValueDeserializer<TProjection>(renderedProjection.ProjectionSerializer),
10151015
_messageEncoderSettings,
10161016
_settings.SerializationDomain)

src/MongoDB.Driver/ProjectionDefinition.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -393,7 +393,7 @@ public object Object
393393
public override BsonDocument Render(RenderArgs<TSource> args)
394394
{
395395
var serializer = args.SerializerRegistry.GetSerializer(_obj.GetType());
396-
return new BsonDocumentWrapper(_obj, serializer);
396+
return new BsonDocumentWrapper(_obj, serializer, args.SerializationDomain);
397397
}
398398
}
399399

@@ -439,7 +439,7 @@ public override RenderedProjectionDefinition<TProjection> Render(RenderArgs<TSou
439439
{
440440
var serializer = args.SerializerRegistry.GetSerializer(_obj.GetType());
441441
return new RenderedProjectionDefinition<TProjection>(
442-
new BsonDocumentWrapper(_obj, serializer),
442+
new BsonDocumentWrapper(_obj, serializer, args.SerializationDomain),
443443
_projectionSerializer ?? args.GetSerializer<TProjection>());
444444
}
445445
}

src/MongoDB.Driver/SortDefinition.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,7 @@ public object Object
178178
public override BsonDocument Render(RenderArgs<TDocument> args)
179179
{
180180
var serializer = args.SerializerRegistry.GetSerializer(_obj.GetType());
181-
return new BsonDocumentWrapper(_obj, serializer);
181+
return new BsonDocumentWrapper(_obj, serializer, args.SerializationDomain);
182182
}
183183
}
184184
}

src/MongoDB.Driver/UpdateDefinition.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -241,7 +241,7 @@ public object Object
241241
public override BsonValue Render(RenderArgs<TDocument> args)
242242
{
243243
var serializer = args.SerializerRegistry.GetSerializer(_obj.GetType());
244-
return new BsonDocumentWrapper(_obj, serializer);
244+
return new BsonDocumentWrapper(_obj, serializer, args.SerializationDomain);
245245
}
246246
}
247247
}

0 commit comments

Comments
 (0)