Skip to content

Commit 060c218

Browse files
author
rstam
committed
CSHARP-933: Reduce the number of places nulls, actual types and discriminators are handled.
1 parent 40c7970 commit 060c218

File tree

143 files changed

+1745
-2240
lines changed

Some content is hidden

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

143 files changed

+1745
-2240
lines changed

src/MongoDB.Bson.Tests/ObjectModel/BsonDocumentWrapperTests.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ private class C
3535
public int X { get; set; }
3636
}
3737

38-
private class CSerializer : BsonBaseSerializer<C>
38+
private class CSerializer : ClassSerializerBase<C>
3939
{
4040
public override void Serialize(BsonSerializationContext context, C value)
4141
{
@@ -240,13 +240,13 @@ public void TestConstructorWithObject()
240240

241241
var wrapper = new BsonDocumentWrapper(c);
242242
Assert.AreEqual(false, wrapper.IsUpdateDocument);
243-
Assert.AreSame(UndiscriminatedActualTypeSerializer.Instance, wrapper.Serializer);
243+
Assert.AreSame(UndiscriminatedActualTypeSerializer<object>.Instance, wrapper.Serializer);
244244
Assert.AreSame(c, wrapper.Wrapped);
245245
Assert.AreEqual(false, wrapper.IsMaterialized);
246246

247247
wrapper = new BsonDocumentWrapper(null);
248248
Assert.AreEqual(false, wrapper.IsUpdateDocument);
249-
Assert.AreSame(UndiscriminatedActualTypeSerializer.Instance, wrapper.Serializer);
249+
Assert.AreSame(UndiscriminatedActualTypeSerializer<object>.Instance, wrapper.Serializer);
250250
Assert.AreSame(null, wrapper.Wrapped);
251251
Assert.AreEqual(false, wrapper.IsMaterialized);
252252
}

src/MongoDB.Bson.Tests/Serialization/BsonSerializerTests.cs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,16 +48,18 @@ public void TestAnonymousClass()
4848

4949
public class Employee
5050
{
51-
private class DateOfBirthSerializer : BsonBaseSerializer<DateTime>
51+
private class DateOfBirthSerializer : StructSerializerBase<DateTime>
5252
{
5353
public override DateTime Deserialize(BsonDeserializationContext context)
5454
{
55-
return XmlConvert.ToDateTime(context.Reader.ReadString(), XmlDateTimeSerializationMode.RoundtripKind);
55+
var bsonReader = context.Reader;
56+
return XmlConvert.ToDateTime(bsonReader.ReadString(), XmlDateTimeSerializationMode.RoundtripKind);
5657
}
5758

5859
public override void Serialize(BsonSerializationContext context, DateTime value)
5960
{
60-
context.Writer.WriteString(value.ToString("yyyy-MM-dd"));
61+
var bsonWriter = context.Writer;
62+
bsonWriter.WriteString(value.ToString("yyyy-MM-dd"));
6163
}
6264
}
6365

src/MongoDB.Bson/MongoDB.Bson.csproj

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,10 @@
204204
<Compile Include="Serialization\Serializers\BsonArraySerializer.cs" />
205205
<Compile Include="Serialization\Serializers\BsonBinaryDataSerializer.cs" />
206206
<Compile Include="Serialization\Serializers\BsonBooleanSerializer.cs" />
207+
<Compile Include="Serialization\Serializers\DiscriminatedWrapperSerializer.cs" />
208+
<Compile Include="Serialization\Serializers\SerializerBase.cs" />
209+
<Compile Include="Serialization\Serializers\SealedClassSerializerBase.cs" />
210+
<Compile Include="Serialization\Serializers\StructSerializerBase.cs" />
207211
<Compile Include="Serialization\Serializers\BsonValueCSharpNullSerializer.cs" />
208212
<Compile Include="Serialization\Serializers\BsonDateTimeSerializer.cs" />
209213
<Compile Include="Serialization\Serializers\BsonDocumentBackedClassSerializer.cs" />
@@ -253,6 +257,7 @@
253257
<Compile Include="Serialization\Serializers\BsonTimestampSerializer.cs" />
254258
<Compile Include="Serialization\Serializers\BsonUndefinedSerializer.cs" />
255259
<Compile Include="Serialization\Serializers\BsonValueSerializer.cs" />
260+
<Compile Include="Serialization\Serializers\BsonValueSerializerBase.cs" />
256261
<Compile Include="Serialization\Serializers\ByteArraySerializer.cs" />
257262
<Compile Include="Serialization\Serializers\ByteSerializer.cs" />
258263
<Compile Include="Serialization\Serializers\CharSerializer.cs" />
@@ -342,7 +347,7 @@
342347
<Compile Include="ObjectModel\BsonMaxKey.cs" />
343348
<Compile Include="ObjectModel\BsonMinKey.cs" />
344349
<Compile Include="Serialization\BsonDefaultSerializationProvider.cs" />
345-
<Compile Include="Serialization\Serializers\BsonBaseSerializer.cs" />
350+
<Compile Include="Serialization\Serializers\ClassSerializerBase.cs" />
346351
<Compile Include="Serialization\Serializers\EnumSerializer.cs" />
347352
<Compile Include="Serialization\Serializers\ArraySerializer.cs" />
348353
<Compile Include="Serialization\IIdGenerator.cs" />

src/MongoDB.Bson/ObjectModel/BsonDocumentWrapper.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ public class BsonDocumentWrapper : MaterializedOnDemandBsonDocument
4646
/// </summary>
4747
/// <param name="value">The value.</param>
4848
public BsonDocumentWrapper(object value)
49-
: this(value, UndiscriminatedActualTypeSerializer.Instance)
49+
: this(value, UndiscriminatedActualTypeSerializer<object>.Instance)
5050
{
5151
}
5252

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

Lines changed: 2 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -22,39 +22,10 @@
2222
namespace MongoDB.Bson.Serialization.Serializers
2323
{
2424
/// <summary>
25-
/// Represents a skeleton serializer for an abstract class that simply forwards Serialize to the actual serializer.
25+
/// Represents a serializer for an abstract class.
2626
/// </summary>
2727
/// <typeparam name="TClass">The type of the class.</typeparam>
28-
public class AbstractClassSerializer<TClass> : BsonBaseSerializer<TClass>
28+
public class AbstractClassSerializer<TClass> : ClassSerializerBase<TClass> where TClass : class
2929
{
30-
/// <summary>
31-
/// Serializes a value.
32-
/// </summary>
33-
/// <param name="context">The serialization context.</param>
34-
/// <param name="value">The value.</param>
35-
/// <exception cref="BsonSerializationException"></exception>
36-
public override void Serialize(BsonSerializationContext context, TClass value)
37-
{
38-
var bsonWriter = context.Writer;
39-
40-
if (value == null)
41-
{
42-
bsonWriter.WriteNull();
43-
return;
44-
}
45-
46-
var actualType = value.GetType();
47-
if (actualType != typeof(TClass))
48-
{
49-
var serializer = BsonSerializer.LookupSerializer(actualType);
50-
serializer.Serialize(context, value);
51-
return;
52-
}
53-
54-
var message = string.Format(
55-
"{0} is not an abstract class.",
56-
BsonUtils.GetFriendlyTypeName(actualType));
57-
throw new BsonSerializationException(message);
58-
}
5930
}
6031
}

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

Lines changed: 30 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -17,16 +17,13 @@
1717
using System.Collections;
1818
using System.IO;
1919
using System.Text;
20-
using MongoDB.Bson.IO;
21-
using MongoDB.Bson.Serialization.Attributes;
22-
using MongoDB.Bson.Serialization.Options;
2320

2421
namespace MongoDB.Bson.Serialization.Serializers
2522
{
2623
/// <summary>
2724
/// Represents a serializer for BitArrays.
2825
/// </summary>
29-
public class BitArraySerializer : BsonBaseSerializer<BitArray>, IRepresentationConfigurable<BitArraySerializer>
26+
public class BitArraySerializer : SealedClassSerializerBase<BitArray>, IRepresentationConfigurable<BitArraySerializer>
3027
{
3128
// private fields
3229
private readonly BsonType _representation;
@@ -79,7 +76,7 @@ public BsonType Representation
7976
/// </summary>
8077
/// <param name="context">The deserialization context.</param>
8178
/// <returns>An object.</returns>
82-
public override BitArray Deserialize(BsonDeserializationContext context)
79+
protected override BitArray DeserializeValue(BsonDeserializationContext context)
8380
{
8481
var bsonReader = context.Reader;
8582
BitArray bitArray;
@@ -123,8 +120,7 @@ public override BitArray Deserialize(BsonDeserializationContext context)
123120
return bitArray;
124121

125122
default:
126-
var message = string.Format("Cannot deserialize BitArray from BsonType {0}.", bsonType);
127-
throw new FileFormatException(message);
123+
throw CreateCannotDeserializeFromBsonTypeException(bsonType);
128124
}
129125
}
130126
#pragma warning restore 618
@@ -133,46 +129,39 @@ public override BitArray Deserialize(BsonDeserializationContext context)
133129
/// Serializes a value.
134130
/// </summary>
135131
/// <param name="context">The serialization context.</param>
136-
/// <param name="value">The object.</param>
137-
public override void Serialize(BsonSerializationContext context, BitArray value)
132+
/// <param name="value">The value.</param>
133+
protected override void SerializeValue(BsonSerializationContext context, BitArray value)
138134
{
139135
var bsonWriter = context.Writer;
140136

141-
if (value == null)
137+
switch (_representation)
142138
{
143-
bsonWriter.WriteNull();
144-
}
145-
else
146-
{
147-
switch (_representation)
148-
{
149-
case BsonType.Binary:
150-
if ((value.Length % 8) == 0)
151-
{
152-
bsonWriter.WriteBytes(GetBytes(value));
153-
}
154-
else
155-
{
156-
bsonWriter.WriteStartDocument();
157-
bsonWriter.WriteInt32("Length", value.Length);
158-
bsonWriter.WriteBytes("Bytes", GetBytes(value));
159-
bsonWriter.WriteEndDocument();
160-
}
161-
break;
139+
case BsonType.Binary:
140+
if ((value.Length % 8) == 0)
141+
{
142+
bsonWriter.WriteBytes(GetBytes(value));
143+
}
144+
else
145+
{
146+
bsonWriter.WriteStartDocument();
147+
bsonWriter.WriteInt32("Length", value.Length);
148+
bsonWriter.WriteBytes("Bytes", GetBytes(value));
149+
bsonWriter.WriteEndDocument();
150+
}
151+
break;
162152

163-
case BsonType.String:
164-
var sb = new StringBuilder(value.Length);
165-
for (int i = 0; i < value.Length; i++)
166-
{
167-
sb.Append(value[i] ? '1' : '0');
168-
}
169-
bsonWriter.WriteString(sb.ToString());
170-
break;
153+
case BsonType.String:
154+
var sb = new StringBuilder(value.Length);
155+
for (int i = 0; i < value.Length; i++)
156+
{
157+
sb.Append(value[i] ? '1' : '0');
158+
}
159+
bsonWriter.WriteString(sb.ToString());
160+
break;
171161

172-
default:
173-
var message = string.Format("'{0}' is not a valid BitArray representation.", _representation);
174-
throw new BsonSerializationException(message);
175-
}
162+
default:
163+
var message = string.Format("'{0}' is not a valid BitArray representation.", _representation);
164+
throw new BsonSerializationException(message);
176165
}
177166
}
178167

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

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ namespace MongoDB.Bson.Serialization.Serializers
2525
/// <summary>
2626
/// Represents a serializer for Booleans.
2727
/// </summary>
28-
public class BooleanSerializer : BsonBaseSerializer<bool>, IRepresentationConfigurable<BooleanSerializer>
28+
public class BooleanSerializer : StructSerializerBase<bool>, IRepresentationConfigurable<BooleanSerializer>
2929
{
3030
// private fields
3131
private readonly BsonType _representation;
@@ -107,8 +107,7 @@ public override bool Deserialize(BsonDeserializationContext context)
107107
return XmlConvert.ToBoolean(bsonReader.ReadString().ToLower());
108108

109109
default:
110-
var message = string.Format("Cannot deserialize Boolean from BsonType {0}.", bsonType);
111-
throw new FileFormatException(message);
110+
throw CreateCannotDeserializeFromBsonTypeException(bsonType);
112111
}
113112
}
114113

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

Lines changed: 13 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -13,16 +13,13 @@
1313
* limitations under the License.
1414
*/
1515

16-
using System;
17-
using System.IO;
18-
using MongoDB.Bson.IO;
1916

2017
namespace MongoDB.Bson.Serialization.Serializers
2118
{
2219
/// <summary>
2320
/// Represents a serializer for BsonArrays.
2421
/// </summary>
25-
public class BsonArraySerializer : BsonBaseSerializer<BsonArray>, IBsonArraySerializer
22+
public class BsonArraySerializer : BsonValueSerializerBase<BsonArray>, IBsonArraySerializer
2623
{
2724
// private static fields
2825
private static BsonArraySerializer __instance = new BsonArraySerializer();
@@ -32,6 +29,7 @@ public class BsonArraySerializer : BsonBaseSerializer<BsonArray>, IBsonArraySeri
3229
/// Initializes a new instance of the BsonArraySerializer class.
3330
/// </summary>
3431
public BsonArraySerializer()
32+
: base(BsonType.Array)
3533
{
3634
}
3735

@@ -50,28 +48,20 @@ public static BsonArraySerializer Instance
5048
/// </summary>
5149
/// <param name="context">The deserialization context.</param>
5250
/// <returns>An object.</returns>
53-
public override BsonArray Deserialize(BsonDeserializationContext context)
51+
protected override BsonArray DeserializeValue(BsonDeserializationContext context)
5452
{
5553
var bsonReader = context.Reader;
5654

57-
var bsonType = bsonReader.GetCurrentBsonType();
58-
switch (bsonType)
55+
bsonReader.ReadStartArray();
56+
var array = new BsonArray();
57+
while (bsonReader.ReadBsonType() != BsonType.EndOfDocument)
5958
{
60-
case BsonType.Array:
61-
bsonReader.ReadStartArray();
62-
var array = new BsonArray();
63-
while (bsonReader.ReadBsonType() != BsonType.EndOfDocument)
64-
{
65-
var item = context.DeserializeWithChildContext(BsonValueSerializer.Instance);
66-
array.Add(item);
67-
}
68-
bsonReader.ReadEndArray();
69-
return array;
70-
71-
default:
72-
var message = string.Format("Cannot deserialize BsonArray from BsonType {0}.", bsonType);
73-
throw new FileFormatException(message);
59+
var item = context.DeserializeWithChildContext(BsonValueSerializer.Instance);
60+
array.Add(item);
7461
}
62+
bsonReader.ReadEndArray();
63+
64+
return array;
7565
}
7666

7767
/// <summary>
@@ -88,20 +78,16 @@ public BsonSerializationInfo GetItemSerializationInfo()
8878
typeof(BsonValue));
8979
}
9080

81+
// protected methods
9182
/// <summary>
9283
/// Serializes a value.
9384
/// </summary>
9485
/// <param name="context">The serialization context.</param>
9586
/// <param name="value">The object.</param>
96-
public override void Serialize(BsonSerializationContext context, BsonArray value)
87+
protected override void SerializeValue(BsonSerializationContext context, BsonArray value)
9788
{
9889
var bsonWriter = context.Writer;
9990

100-
if (value == null)
101-
{
102-
throw new ArgumentNullException("value");
103-
}
104-
10591
bsonWriter.WriteStartArray();
10692
for (int i = 0; i < value.Count; i++)
10793
{

0 commit comments

Comments
 (0)