Skip to content

Commit a84681b

Browse files
author
rstam
committed
Merge commit 'dcf5dd' into bsondefaultserializationprovider
2 parents 611abb0 + dcf5dd8 commit a84681b

File tree

6 files changed

+68
-33
lines changed

6 files changed

+68
-33
lines changed

Bson/Bson.csproj

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@
9898
<Compile Include="Serialization\Attributes\BsonIgnoreIfDefaultAttribute.cs" />
9999
<Compile Include="Serialization\Attributes\BsonRepresentationAttribute.cs" />
100100
<Compile Include="Serialization\Attributes\BsonSerializationOptionsAttribute.cs" />
101+
<Compile Include="Serialization\BsonClassMapSerializationProvider.cs" />
101102
<Compile Include="Serialization\Conventions\ExtraElementsMemberConventions.cs" />
102103
<Compile Include="Serialization\Conventions\IgnoreIfDefaultConventions.cs" />
103104
<Compile Include="Serialization\Conventions\SerializationOptionsConventions.cs" />
@@ -205,7 +206,7 @@
205206
<Compile Include="ObjectModel\BsonMaxKey.cs" />
206207
<Compile Include="ObjectModel\BsonMinKey.cs" />
207208
<Compile Include="IO\BsonBuffer.cs" />
208-
<Compile Include="Serialization\BsonDefaultSerializer.cs" />
209+
<Compile Include="Serialization\BsonDefaultSerializationProvider.cs" />
209210
<Compile Include="Serialization\Serializers\BsonBaseSerializer.cs" />
210211
<Compile Include="Serialization\Serializers\EnumSerializer.cs" />
211212
<Compile Include="Serialization\Serializers\ArraySerializer.cs" />
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using System.Text;
5+
6+
namespace MongoDB.Bson.Serialization
7+
{
8+
/// <summary>
9+
/// Represents the class map serialization provider.
10+
/// </summary>
11+
internal class BsonClassMapSerializationProvider : IBsonSerializationProvider
12+
{
13+
/// <summary>
14+
/// Gets the serializer for a type.
15+
/// </summary>
16+
/// <param name="type">The type.</param>
17+
/// <returns>The serializer.</returns>
18+
public IBsonSerializer GetSerializer(Type type)
19+
{
20+
if ((type.IsClass || (type.IsValueType && !type.IsPrimitive)) &&
21+
!typeof(Array).IsAssignableFrom(type) &&
22+
!typeof(Enum).IsAssignableFrom(type))
23+
{
24+
var classMap = BsonClassMap.LookupClassMap(type);
25+
return new BsonClassMapSerializer(classMap);
26+
}
27+
28+
return null;
29+
}
30+
}
31+
}

Bson/Serialization/BsonDefaultSerializer.cs renamed to Bson/Serialization/BsonDefaultSerializationProvider.cs

Lines changed: 4 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -38,15 +38,15 @@ namespace MongoDB.Bson.Serialization
3838
/// <summary>
3939
/// Represents the default serialization provider.
4040
/// </summary>
41-
public class BsonDefaultSerializer : IBsonSerializationProvider
41+
internal class BsonDefaultSerializationProvider : IBsonSerializationProvider
4242
{
4343
// private static fields
44-
private static BsonDefaultSerializer __instance = new BsonDefaultSerializer();
44+
private static BsonDefaultSerializationProvider __instance = new BsonDefaultSerializationProvider();
4545
private static Dictionary<Type, IBsonSerializer> __serializers;
4646
private static Dictionary<Type, Type> __genericSerializerDefinitions;
4747

4848
// static constructor
49-
static BsonDefaultSerializer()
49+
static BsonDefaultSerializationProvider()
5050
{
5151
__serializers = new Dictionary<Type, IBsonSerializer>
5252
{
@@ -139,19 +139,10 @@ static BsonDefaultSerializer()
139139
/// <summary>
140140
/// Initializes a new instance of the BsonDefaultSerializer class.
141141
/// </summary>
142-
public BsonDefaultSerializer()
142+
public BsonDefaultSerializationProvider()
143143
{
144144
}
145145

146-
// public static properties
147-
/// <summary>
148-
/// Gets an instance of the BsonDefaultSerializer class.
149-
/// </summary>
150-
public static BsonDefaultSerializer Instance
151-
{
152-
get { return __instance; }
153-
}
154-
155146
// public methods
156147
/// <summary>
157148
/// Gets the serializer for a type.
@@ -205,14 +196,6 @@ public IBsonSerializer GetSerializer(Type type)
205196
return EnumSerializer.Instance;
206197
}
207198

208-
if ((type.IsClass || (type.IsValueType && !type.IsPrimitive)) &&
209-
!typeof(Array).IsAssignableFrom(type) &&
210-
!typeof(Enum).IsAssignableFrom(type))
211-
{
212-
var classMap = BsonClassMap.LookupClassMap(type);
213-
return new BsonClassMapSerializer(classMap);
214-
}
215-
216199
return null;
217200
}
218201
}

Bson/Serialization/BsonSerializer.cs

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,8 @@ public static class BsonSerializer
4141
private static List<IBsonSerializationProvider> __serializationProviders = new List<IBsonSerializationProvider>();
4242
private static Dictionary<Type, IDiscriminatorConvention> __discriminatorConventions = new Dictionary<Type, IDiscriminatorConvention>();
4343
private static Dictionary<BsonValue, HashSet<Type>> __discriminators = new Dictionary<BsonValue, HashSet<Type>>();
44-
private static HashSet<Type> __typesWithRegisteredKnownTypes = new HashSet<Type>();
4544
private static HashSet<Type> __discriminatedTypes = new HashSet<Type>();
45+
private static HashSet<Type> __typesWithRegisteredKnownTypes = new HashSet<Type>();
4646

4747
private static bool __useNullIdChecker = false;
4848
private static bool __useZeroIdChecker = false;
@@ -214,7 +214,7 @@ public static object Deserialize(BsonReader bsonReader, Type nominalType, IBsonS
214214
// if nominalType is an interface find out the actualType and use it instead
215215
if (nominalType.IsInterface)
216216
{
217-
var discriminatorConvention = BsonSerializer.LookupDiscriminatorConvention(nominalType);
217+
var discriminatorConvention = LookupDiscriminatorConvention(nominalType);
218218
var actualType = discriminatorConvention.GetActualType(bsonReader, nominalType);
219219
if (actualType == nominalType)
220220
{
@@ -431,7 +431,7 @@ public static IDiscriminatorConvention LookupDiscriminatorConvention(Type type)
431431
var unregisteredType = type;
432432
while (unregisteredType != parentType)
433433
{
434-
BsonSerializer.RegisterDiscriminatorConvention(unregisteredType, convention);
434+
RegisterDiscriminatorConvention(unregisteredType, convention);
435435
unregisteredType = unregisteredType.BaseType;
436436
}
437437
}
@@ -834,8 +834,8 @@ internal static void EnsureKnownTypesAreRegistered(Type nominalType)
834834
var knownTypesAttribute = nominalType.GetCustomAttributes(typeof(BsonKnownTypesAttribute), false);
835835
if (knownTypesAttribute != null && knownTypesAttribute.Length > 0)
836836
{
837-
// known types will be registered as a side effect of calling LookupClassMap
838-
BsonClassMap.LookupClassMap(nominalType);
837+
//try and force a scan of the known types
838+
LookupSerializer(nominalType);
839839
}
840840

841841
__typesWithRegisteredKnownTypes.Add(nominalType);
@@ -850,14 +850,16 @@ internal static void EnsureKnownTypesAreRegistered(Type nominalType)
850850
// private static methods
851851
private static void RegisterDefaultSerializationProvider()
852852
{
853-
RegisterSerializationProvider(BsonDefaultSerializer.Instance);
853+
//These are run in reverse order.
854+
RegisterSerializationProvider(new BsonClassMapSerializationProvider());
855+
RegisterSerializationProvider(new BsonDefaultSerializationProvider());
854856
}
855857

856858
private static void RegisterIdGenerators()
857859
{
858-
BsonSerializer.RegisterIdGenerator(typeof(BsonObjectId), BsonObjectIdGenerator.Instance);
859-
BsonSerializer.RegisterIdGenerator(typeof(Guid), GuidGenerator.Instance);
860-
BsonSerializer.RegisterIdGenerator(typeof(ObjectId), ObjectIdGenerator.Instance);
860+
RegisterIdGenerator(typeof(BsonObjectId), BsonObjectIdGenerator.Instance);
861+
RegisterIdGenerator(typeof(Guid), GuidGenerator.Instance);
862+
RegisterIdGenerator(typeof(ObjectId), ObjectIdGenerator.Instance);
861863
}
862864
}
863865
}

BsonUnitTests/BsonUnitTests.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,7 @@
168168
<Compile Include="IO\BsonRoundTripTests.cs" />
169169
<Compile Include="ObjectModel\BsonValueCompareToTests.cs" />
170170
<Compile Include="Properties\AssemblyInfo.cs" />
171-
<Compile Include="DefaultSerializer\BsonDefaultSerializerTests.cs" />
171+
<Compile Include="DefaultSerializer\BsonSerializerTests.cs" />
172172
<Compile Include="DefaultSerializer\Serializers\ArraySerializerTests.cs" />
173173
<Compile Include="DefaultSerializer\SerializeEnumTests.cs" />
174174
<Compile Include="DefaultSerializer\Serializers\GenericEnumerableSerializerTests.cs" />

BsonUnitTests/DefaultSerializer/BsonDefaultSerializerTests.cs renamed to BsonUnitTests/DefaultSerializer/BsonSerializerTests.cs

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232
namespace MongoDB.BsonUnitTests.Serialization
3333
{
3434
[TestFixture]
35-
public class BsonDefaultSerializerTests
35+
public class BsonSerializerTests
3636
{
3737
[Test]
3838
public void TestAnonymousClass()
@@ -191,5 +191,23 @@ public void TestSerializeInventoryItem()
191191
Assert.IsTrue(rehydrated.WasBeginInitCalled);
192192
Assert.IsTrue(rehydrated.WasEndInitCalled);
193193
}
194+
195+
[BsonKnownTypes(typeof(B), typeof(C))]
196+
private class A
197+
{ }
198+
199+
private class B : A
200+
{ }
201+
202+
private class C : A
203+
{ }
204+
205+
[Test]
206+
public void TestLookupActualType()
207+
{
208+
var actualType = BsonSerializer.LookupActualType(typeof(A), BsonValue.Create("C"));
209+
210+
Assert.AreEqual(typeof(C), actualType);
211+
}
194212
}
195213
}

0 commit comments

Comments
 (0)