Skip to content

Commit 856cfb8

Browse files
committed
Improved deserialization to work as serialization
1 parent a587d6d commit 856cfb8

File tree

8 files changed

+36
-29
lines changed

8 files changed

+36
-29
lines changed

src/MongoDB.Bson/IO/BsonBinaryReaderSettings.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,8 @@ protected override BsonReaderSettings CloneImplementation()
136136
Encoding = _encoding,
137137
FixOldBinarySubTypeOnInput = _fixOldBinarySubTypeOnInput,
138138
FixOldDateTimeMaxValueOnInput = _fixOldDateTimeMaxValueOnInput,
139-
MaxDocumentSize = _maxDocumentSize
139+
MaxDocumentSize = _maxDocumentSize,
140+
SerializationDomain = SerializationDomain, //TODO This can be improved
140141
};
141142

142143
return clone;

src/MongoDB.Bson/IO/BsonDocumentReaderSettings.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ public static BsonDocumentReaderSettings Defaults
6767
/// <returns>A clone of the settings.</returns>
6868
protected override BsonReaderSettings CloneImplementation()
6969
{
70-
var clone = new BsonDocumentReaderSettings();
70+
var clone = new BsonDocumentReaderSettings { SerializationDomain = SerializationDomain }; //TODO This can be improved
7171
return clone;
7272
}
7373
}

src/MongoDB.Bson/IO/BsonReaderSettings.cs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
*/
1515

1616
using System;
17+
using MongoDB.Bson.Serialization;
1718

1819
namespace MongoDB.Bson.IO
1920
{
@@ -24,6 +25,7 @@ public abstract class BsonReaderSettings
2425
{
2526
// private fields
2627
private bool _isFrozen;
28+
private IBsonSerializationDomain _serializationDomain;
2729

2830
// constructors
2931
/// <summary>
@@ -77,6 +79,19 @@ public BsonReaderSettings FrozenCopy()
7779
}
7880
}
7981

82+
/// <summary>
83+
/// //TODO
84+
/// </summary>
85+
public IBsonSerializationDomain SerializationDomain
86+
{
87+
get => _serializationDomain;
88+
set
89+
{
90+
if (_isFrozen) { ThrowFrozenException(); }
91+
_serializationDomain = value;
92+
}
93+
}
94+
8095
// protected methods
8196
/// <summary>
8297
/// Creates a clone of the settings.

src/MongoDB.Bson/IO/IBsonReader.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ public interface IBsonReader : IDisposable
6262
/// <summary>
6363
/// Pops the settings.
6464
/// </summary>
65-
void PopSettings();
65+
void PopSettings(); //TODO Why do we have push and pop methods? They are not used
6666

6767
/// <summary>
6868
/// Pushes new settings for the reader.
@@ -246,6 +246,11 @@ public interface IBsonReader : IDisposable
246246
/// <param name="bookmark">The bookmark.</param>
247247
void ReturnToBookmark(BsonReaderBookmark bookmark);
248248

249+
/// <summary>
250+
/// Gets the settings of the reader.
251+
/// </summary>
252+
BsonReaderSettings Settings { get; }
253+
249254
/// <summary>
250255
/// Skips the name (reader must be positioned on a name).
251256
/// </summary>

src/MongoDB.Bson/IO/JsonReaderSettings.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ public static JsonReaderSettings Defaults
6868
/// <returns>A clone of the settings.</returns>
6969
protected override BsonReaderSettings CloneImplementation()
7070
{
71-
var clone = new JsonReaderSettings();
71+
var clone = new JsonReaderSettings { SerializationDomain = SerializationDomain }; //TODO This can be improved
7272
return clone;
7373
}
7474
}

src/MongoDB.Bson/Serialization/BsonDeserializationContext.cs

Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,6 @@
1515

1616
using System;
1717
using MongoDB.Bson.IO;
18-
using MongoDB.Bson.Serialization.Options;
19-
using MongoDB.Bson.Serialization.Serializers;
2018

2119
namespace MongoDB.Bson.Serialization
2220
{
@@ -37,14 +35,13 @@ private BsonDeserializationContext(
3735
IBsonReader reader,
3836
bool allowDuplicateElementNames,
3937
IBsonSerializer dynamicArraySerializer,
40-
IBsonSerializer dynamicDocumentSerializer,
41-
IBsonSerializationDomain domain)
38+
IBsonSerializer dynamicDocumentSerializer)
4239
{
4340
_reader = reader;
4441
_allowDuplicateElementNames = allowDuplicateElementNames;
4542
_dynamicArraySerializer = dynamicArraySerializer;
4643
_dynamicDocumentSerializer = dynamicDocumentSerializer;
47-
_domain = domain;
44+
_domain = reader.Settings.SerializationDomain ?? BsonSerializer.DefaultDomain;
4845
}
4946

5047
// public properties
@@ -221,23 +218,14 @@ public IBsonReader Reader
221218
get { return _reader; }
222219
}
223220

224-
/// <summary>
225-
/// //TODO
226-
/// </summary>
227-
public IBsonSerializationDomain Domain
228-
{
229-
get => _domain;
230-
set => _domain = value;
231-
}
232-
233221
// public methods
234222
/// <summary>
235223
/// Builds the BsonDeserializationContext instance.
236224
/// </summary>
237225
/// <returns>A BsonDeserializationContext.</returns>
238226
internal BsonDeserializationContext Build()
239227
{
240-
return new BsonDeserializationContext(_reader, _allowDuplicateElementNames, _dynamicArraySerializer, _dynamicDocumentSerializer, _domain);
228+
return new BsonDeserializationContext(_reader, _allowDuplicateElementNames, _dynamicArraySerializer, _dynamicDocumentSerializer);
241229
}
242230
}
243231
}

src/MongoDB.Bson/Serialization/BsonSerializationDomain.cs

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -18,25 +18,21 @@ namespace MongoDB.Bson.Serialization
1818
internal class BsonSerializationDomain : IBsonSerializationDomainInternal, IDisposable
1919
{
2020
// private fields
21-
private ReaderWriterLockSlim _configLock =
22-
new ReaderWriterLockSlim(LockRecursionPolicy.SupportsRecursion);
21+
private ReaderWriterLockSlim _configLock = new(LockRecursionPolicy.SupportsRecursion);
2322

24-
private Dictionary<Type, IIdGenerator> _idGenerators = new Dictionary<Type, IIdGenerator>();
23+
private Dictionary<Type, IIdGenerator> _idGenerators = new();
2524

26-
private Dictionary<Type, IDiscriminatorConvention> _discriminatorConventions =
27-
new Dictionary<Type, IDiscriminatorConvention>();
25+
private Dictionary<Type, IDiscriminatorConvention> _discriminatorConventions = new();
2826

29-
private Dictionary<BsonValue, HashSet<Type>> _discriminators =
30-
new Dictionary<BsonValue, HashSet<Type>>();
27+
private Dictionary<BsonValue, HashSet<Type>> _discriminators = new();
3128

32-
private HashSet<Type> _discriminatedTypes = new HashSet<Type>();
29+
private HashSet<Type> _discriminatedTypes = new();
3330
private BsonSerializerRegistry _serializerRegistry;
3431

3532
private TypeMappingSerializationProvider _typeMappingSerializationProvider;
3633

3734
// ConcurrentDictionary<Type, object> is being used as a concurrent set of Type. The values will always be null.
38-
private ConcurrentDictionary<Type, object> _typesWithRegisteredKnownTypes =
39-
new ConcurrentDictionary<Type, object>();
35+
private ConcurrentDictionary<Type, object> _typesWithRegisteredKnownTypes = new();
4036

4137
private bool _useNullIdChecker = false;
4238
private bool _useZeroIdChecker = false;

src/MongoDB.Driver/Core/Operations/CursorBatchDeserializationHelper.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@ public static List<TDocument> DeserializeBatch<TDocument>(RawBsonArray batch, IB
4444
if (messageEncoderSettings != null)
4545
{
4646
readerSettings.Encoding = messageEncoderSettings.GetOrDefault(MessageEncoderSettingsName.ReadEncoding, Utf8Encodings.Strict);
47+
readerSettings.SerializationDomain =
48+
messageEncoderSettings.GetOrDefault<IBsonSerializationDomain>(MessageEncoderSettingsName.SerializationDomain, null);
4749
};
4850

4951
using (var stream = new ByteBufferStream(batch.Slice, ownsBuffer: false))

0 commit comments

Comments
 (0)