Skip to content

Commit 94e1796

Browse files
committed
Merge
1 parent c288aad commit 94e1796

File tree

261 files changed

+4803
-1675
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

261 files changed

+4803
-1675
lines changed

src/MongoDB.Bson/BsonDefaults.cs

Lines changed: 13 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -24,71 +24,46 @@ namespace MongoDB.Bson
2424
/// </summary>
2525
public static class BsonDefaults
2626
{
27-
// private static fields
28-
private static bool __dynamicArraySerializerWasSet;
29-
private static IBsonSerializer __dynamicArraySerializer;
30-
private static bool __dynamicDocumentSerializerWasSet;
31-
private static IBsonSerializer __dynamicDocumentSerializer;
32-
private static int __maxDocumentSize = int.MaxValue;
33-
private static int __maxSerializationDepth = 100;
34-
3527
// public static properties
3628
/// <summary>
3729
/// Gets or sets the dynamic array serializer.
3830
/// </summary>
3931
public static IBsonSerializer DynamicArraySerializer
4032
{
41-
get
42-
{
43-
if (!__dynamicArraySerializerWasSet)
44-
{
45-
__dynamicArraySerializer = BsonSerializer.LookupSerializer<List<object>>();
46-
}
47-
return __dynamicArraySerializer;
48-
}
49-
set
50-
{
51-
__dynamicArraySerializerWasSet = true;
52-
__dynamicArraySerializer = value;
53-
}
33+
get => BsonSerializer.DefaultSerializationDomain.BsonDefaults.DynamicArraySerializer;
34+
set => BsonSerializer.DefaultSerializationDomain.BsonDefaults.DynamicArraySerializer = value;
5435
}
5536

5637
/// <summary>
5738
/// Gets or sets the dynamic document serializer.
5839
/// </summary>
5940
public static IBsonSerializer DynamicDocumentSerializer
6041
{
61-
get
62-
{
63-
if (!__dynamicDocumentSerializerWasSet)
64-
{
65-
__dynamicDocumentSerializer = BsonSerializer.LookupSerializer<ExpandoObject>();
66-
}
67-
return __dynamicDocumentSerializer;
68-
}
69-
set
70-
{
71-
__dynamicDocumentSerializerWasSet = true;
72-
__dynamicDocumentSerializer = value;
73-
}
42+
get => BsonSerializer.DefaultSerializationDomain.BsonDefaults.DynamicDocumentSerializer;
43+
set => BsonSerializer.DefaultSerializationDomain.BsonDefaults.DynamicDocumentSerializer = value;
7444
}
7545

46+
/* DOMAIN-API We should modify the API to have those two values (and in the writer/reader settings where they are used) be nullable.
47+
* The problem is that we need to now when these values have been set externally or not. If they have not, then they should
48+
* be retrieved from the closest domain.
49+
*/
50+
7651
/// <summary>
7752
/// Gets or sets the default max document size. The default is 4MiB.
7853
/// </summary>
7954
public static int MaxDocumentSize
8055
{
81-
get { return __maxDocumentSize; }
82-
set { __maxDocumentSize = value; }
56+
get => BsonSerializer.DefaultSerializationDomain.BsonDefaults.MaxDocumentSize;
57+
set => BsonSerializer.DefaultSerializationDomain.BsonDefaults.MaxDocumentSize = value;
8358
}
8459

8560
/// <summary>
8661
/// Gets or sets the default max serialization depth (used to detect circular references during serialization). The default is 100.
8762
/// </summary>
8863
public static int MaxSerializationDepth
8964
{
90-
get { return __maxSerializationDepth; }
91-
set { __maxSerializationDepth = value; }
65+
get => BsonSerializer.DefaultSerializationDomain.BsonDefaults.MaxSerializationDepth;
66+
set => BsonSerializer.DefaultSerializationDomain.BsonDefaults.MaxSerializationDepth = value;
9267
}
9368
}
9469
}
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
/* Copyright 2010-present MongoDB Inc.
2+
*
3+
* Licensed under the Apache License, Version 2.0 (the "License");
4+
* you may not use this file except in compliance with the License.
5+
* You may obtain a copy of the License at
6+
*
7+
* http://www.apache.org/licenses/LICENSE-2.0
8+
*
9+
* Unless required by applicable law or agreed to in writing, software
10+
* distributed under the License is distributed on an "AS IS" BASIS,
11+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
* See the License for the specific language governing permissions and
13+
* limitations under the License.
14+
*/
15+
16+
using System.Collections.Generic;
17+
using System.Dynamic;
18+
using MongoDB.Bson.Serialization;
19+
20+
namespace MongoDB.Bson
21+
{
22+
internal class BsonDefaultsDomain : IBsonDefaults
23+
{
24+
private IBsonSerializationDomain _serializationDomain;
25+
private bool _dynamicArraySerializerWasSet;
26+
private IBsonSerializer _dynamicArraySerializer;
27+
private bool _dynamicDocumentSerializerWasSet;
28+
private IBsonSerializer _dynamicDocumentSerializer;
29+
30+
public BsonDefaultsDomain(IBsonSerializationDomain serializationDomain)
31+
{
32+
_serializationDomain = serializationDomain;
33+
}
34+
35+
public IBsonSerializer DynamicArraySerializer
36+
{
37+
get
38+
{
39+
if (!_dynamicArraySerializerWasSet)
40+
{
41+
_dynamicArraySerializer = _serializationDomain.LookupSerializer<List<object>>();
42+
}
43+
return _dynamicArraySerializer;
44+
}
45+
set
46+
{
47+
_dynamicArraySerializerWasSet = true;
48+
_dynamicArraySerializer = value;
49+
}
50+
}
51+
52+
public IBsonSerializer DynamicDocumentSerializer
53+
{
54+
get
55+
{
56+
if (!_dynamicDocumentSerializerWasSet)
57+
{
58+
_dynamicDocumentSerializer = _serializationDomain.LookupSerializer<ExpandoObject>();
59+
}
60+
return _dynamicDocumentSerializer;
61+
}
62+
set
63+
{
64+
_dynamicDocumentSerializerWasSet = true;
65+
_dynamicDocumentSerializer = value;
66+
}
67+
}
68+
69+
public int MaxDocumentSize { get; set; } = int.MaxValue;
70+
71+
public int MaxSerializationDepth { get; set; } = 100;
72+
}
73+
}

src/MongoDB.Bson/BsonExtensionMethods.cs

Lines changed: 54 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ namespace MongoDB.Bson
2525
/// </summary>
2626
public static class BsonExtensionMethods
2727
{
28+
//DOMAIN-API We should remove this and use the version with the domain.
29+
//QUESTION: Do we want to do something now about this...? It's used also internally, but it seems in most cases it's used for "default serialization", so it should be ok.
2830
/// <summary>
2931
/// Serializes an object to a BSON byte array.
3032
/// </summary>
@@ -49,6 +51,21 @@ public static byte[] ToBson<TNominalType>(
4951
return ToBson(obj, typeof(TNominalType), writerSettings, serializer, configurator, args, estimatedBsonSize);
5052
}
5153

54+
internal static byte[] ToBson<TNominalType>(
55+
this TNominalType obj,
56+
IBsonSerializationDomain serializationDomain,
57+
IBsonSerializer<TNominalType> serializer = null,
58+
BsonBinaryWriterSettings writerSettings = null,
59+
Action<BsonSerializationContext.Builder> configurator = null,
60+
BsonSerializationArgs args = default(BsonSerializationArgs),
61+
int estimatedBsonSize = 0)
62+
{
63+
args.SetOrValidateNominalType(typeof(TNominalType), "<TNominalType>");
64+
65+
return ToBson(obj, typeof(TNominalType), serializationDomain, writerSettings, serializer, configurator, args, estimatedBsonSize);
66+
}
67+
68+
//DOMAIN-API We should remove this and use the version with the domain.
5269
/// <summary>
5370
/// Serializes an object to a BSON byte array.
5471
/// </summary>
@@ -68,6 +85,17 @@ public static byte[] ToBson(
6885
BsonBinaryWriterSettings writerSettings = null,
6986
IBsonSerializer serializer = null,
7087
Action<BsonSerializationContext.Builder> configurator = null,
88+
BsonSerializationArgs args = default,
89+
int estimatedBsonSize = 0) => ToBson(obj, nominalType, BsonSerializer.DefaultSerializationDomain, writerSettings,
90+
serializer, configurator, args, estimatedBsonSize);
91+
92+
internal static byte[] ToBson(
93+
this object obj,
94+
Type nominalType,
95+
IBsonSerializationDomain serializationDomain,
96+
BsonBinaryWriterSettings writerSettings = null,
97+
IBsonSerializer serializer = null,
98+
Action<BsonSerializationContext.Builder> configurator = null,
7199
BsonSerializationArgs args = default(BsonSerializationArgs),
72100
int estimatedBsonSize = 0)
73101
{
@@ -84,7 +112,7 @@ public static byte[] ToBson(
84112

85113
if (serializer == null)
86114
{
87-
serializer = BsonSerializer.LookupSerializer(nominalType);
115+
serializer = serializationDomain.LookupSerializer(nominalType);
88116
}
89117
if (serializer.ValueType != nominalType)
90118
{
@@ -96,7 +124,7 @@ public static byte[] ToBson(
96124
{
97125
using (var bsonWriter = new BsonBinaryWriter(memoryStream, writerSettings ?? BsonBinaryWriterSettings.Defaults))
98126
{
99-
var context = BsonSerializationContext.CreateRoot(bsonWriter, configurator);
127+
var context = BsonSerializationContext.CreateRoot(bsonWriter, serializationDomain, configurator);
100128
serializer.Serialize(context, args, obj);
101129
}
102130
return memoryStream.ToArray();
@@ -138,7 +166,16 @@ public static BsonDocument ToBsonDocument(
138166
Type nominalType,
139167
IBsonSerializer serializer = null,
140168
Action<BsonSerializationContext.Builder> configurator = null,
141-
BsonSerializationArgs args = default(BsonSerializationArgs))
169+
BsonSerializationArgs args = default) => ToBsonDocument(obj, nominalType,
170+
BsonSerializer.DefaultSerializationDomain, serializer, configurator, args);
171+
172+
internal static BsonDocument ToBsonDocument(
173+
this object obj,
174+
Type nominalType,
175+
IBsonSerializationDomain serializationDomain,
176+
IBsonSerializer serializer = null,
177+
Action<BsonSerializationContext.Builder> configurator = null,
178+
BsonSerializationArgs args = default)
142179
{
143180
if (nominalType == null)
144181
{
@@ -165,7 +202,7 @@ public static BsonDocument ToBsonDocument(
165202
return convertibleToBsonDocument.ToBsonDocument(); // use the provided ToBsonDocument method
166203
}
167204

168-
serializer = BsonSerializer.LookupSerializer(nominalType);
205+
serializer = serializationDomain.LookupSerializer(nominalType);
169206
}
170207
if (serializer.ValueType != nominalType)
171208
{
@@ -177,7 +214,7 @@ public static BsonDocument ToBsonDocument(
177214
var document = new BsonDocument();
178215
using (var bsonWriter = new BsonDocumentWriter(document))
179216
{
180-
var context = BsonSerializationContext.CreateRoot(bsonWriter, configurator);
217+
var context = BsonSerializationContext.CreateRoot(bsonWriter, serializationDomain, configurator);
181218
serializer.Serialize(context, args, obj);
182219
}
183220
return document;
@@ -226,6 +263,16 @@ public static string ToJson(
226263
JsonWriterSettings writerSettings = null,
227264
IBsonSerializer serializer = null,
228265
Action<BsonSerializationContext.Builder> configurator = null,
266+
BsonSerializationArgs args = default)
267+
=> ToJson(obj, nominalType, BsonSerializer.DefaultSerializationDomain, writerSettings, serializer, configurator, args);
268+
269+
internal static string ToJson(
270+
this object obj,
271+
Type nominalType,
272+
IBsonSerializationDomain domain,
273+
JsonWriterSettings writerSettings = null,
274+
IBsonSerializer serializer = null,
275+
Action<BsonSerializationContext.Builder> configurator = null,
229276
BsonSerializationArgs args = default(BsonSerializationArgs))
230277
{
231278
if (nominalType == null)
@@ -236,7 +283,7 @@ public static string ToJson(
236283

237284
if (serializer == null)
238285
{
239-
serializer = BsonSerializer.LookupSerializer(nominalType);
286+
serializer = domain.LookupSerializer(nominalType);
240287
}
241288
if (serializer.ValueType != nominalType)
242289
{
@@ -248,7 +295,7 @@ public static string ToJson(
248295
{
249296
using (var bsonWriter = new JsonWriter(stringWriter, writerSettings ?? JsonWriterSettings.Defaults))
250297
{
251-
var context = BsonSerializationContext.CreateRoot(bsonWriter, configurator);
298+
var context = BsonSerializationContext.CreateRoot(bsonWriter, domain, configurator);
252299
serializer.Serialize(context, args, obj);
253300
}
254301
return stringWriter.ToString();

src/MongoDB.Bson/IBsonDefaults.cs

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
/* Copyright 2010-present MongoDB Inc.
2+
*
3+
* Licensed under the Apache License, Version 2.0 (the "License");
4+
* you may not use this file except in compliance with the License.
5+
* You may obtain a copy of the License at
6+
*
7+
* http://www.apache.org/licenses/LICENSE-2.0
8+
*
9+
* Unless required by applicable law or agreed to in writing, software
10+
* distributed under the License is distributed on an "AS IS" BASIS,
11+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
* See the License for the specific language governing permissions and
13+
* limitations under the License.
14+
*/
15+
16+
using MongoDB.Bson.Serialization;
17+
18+
namespace MongoDB.Bson
19+
{
20+
internal interface IBsonDefaults
21+
{
22+
/// <summary>
23+
///
24+
/// </summary>
25+
IBsonSerializer DynamicArraySerializer { get; set; }
26+
/// <summary>
27+
///
28+
/// </summary>
29+
IBsonSerializer DynamicDocumentSerializer { get; set; }
30+
/// <summary>
31+
///
32+
/// </summary>
33+
int MaxDocumentSize { get; set; }
34+
/// <summary>
35+
///
36+
/// </summary>
37+
int MaxSerializationDepth { get; set; }
38+
}
39+
}

src/MongoDB.Bson/IO/BsonBinaryReaderSettings.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ protected override BsonReaderSettings CloneImplementation()
136136
Encoding = _encoding,
137137
FixOldBinarySubTypeOnInput = _fixOldBinarySubTypeOnInput,
138138
FixOldDateTimeMaxValueOnInput = _fixOldDateTimeMaxValueOnInput,
139-
MaxDocumentSize = _maxDocumentSize
139+
MaxDocumentSize = _maxDocumentSize,
140140
};
141141

142142
return clone;

src/MongoDB.Bson/IO/BsonBinaryWriterSettings.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ protected override BsonWriterSettings CloneImplementation()
122122
Encoding = _encoding,
123123
FixOldBinarySubTypeOnOutput = _fixOldBinarySubTypeOnOutput,
124124
MaxDocumentSize = _maxDocumentSize,
125-
MaxSerializationDepth = MaxSerializationDepth
125+
MaxSerializationDepth = MaxSerializationDepth,
126126
};
127127
return clone;
128128
}

src/MongoDB.Bson/IO/BsonReader.cs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -321,13 +321,15 @@ public virtual IByteBuffer ReadRawBsonArray()
321321
// overridden in BsonBinaryReader to read the raw bytes from the stream
322322
// for all other streams, deserialize the array and reserialize it using a BsonBinaryWriter to get the raw bytes
323323

324-
var deserializationContext = BsonDeserializationContext.CreateRoot(this);
324+
//QUESTION Is it correct we only need a default domain here?
325+
var deserializationContext = BsonDeserializationContext.CreateRoot(this, BsonSerializer.DefaultSerializationDomain);
325326
var array = BsonArraySerializer.Instance.Deserialize(deserializationContext);
326327

327328
using (var memoryStream = new MemoryStream())
328329
using (var bsonWriter = new BsonBinaryWriter(memoryStream, BsonBinaryWriterSettings.Defaults))
329330
{
330-
var serializationContext = BsonSerializationContext.CreateRoot(bsonWriter);
331+
//QUESTION Is it correct we only need a default domain here?
332+
var serializationContext = BsonSerializationContext.CreateRoot(bsonWriter, BsonSerializer.DefaultSerializationDomain);
331333
bsonWriter.WriteStartDocument();
332334
var startPosition = memoryStream.Position + 3; // just past BsonType, "x" and null byte
333335
bsonWriter.WriteName("x");
@@ -351,7 +353,8 @@ public virtual IByteBuffer ReadRawBsonDocument()
351353
// overridden in BsonBinaryReader to read the raw bytes from the stream
352354
// for all other streams, deserialize the document and use ToBson to get the raw bytes
353355

354-
var deserializationContext = BsonDeserializationContext.CreateRoot(this);
356+
//QUESTION Is it correct we only need a default domain here?
357+
var deserializationContext = BsonDeserializationContext.CreateRoot(this, BsonSerializer.DefaultSerializationDomain);
355358
var document = BsonDocumentSerializer.Instance.Deserialize(deserializationContext);
356359
var bytes = document.ToBson();
357360
return new ByteArrayBuffer(bytes, isReadOnly: true);

src/MongoDB.Bson/IO/BsonReaderSettings.cs

Lines changed: 1 addition & 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
{

0 commit comments

Comments
 (0)