Skip to content

Commit c73b68f

Browse files
committed
refactored IBsonSerializer to not be aware of members instead opting for a more granular interface such the implementors of IBsonSerializer don't need to implement methods that don't apply.
1 parent e022258 commit c73b68f

File tree

8 files changed

+34
-28
lines changed

8 files changed

+34
-28
lines changed

Bson/Bson.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,7 @@
105105
<Compile Include="Serialization\IBsonClassMapModifier.cs" />
106106
<Compile Include="Serialization\IBsonMemberMapModifier.cs" />
107107
<Compile Include="Serialization\IBsonIdProvider.cs" />
108+
<Compile Include="Serialization\IBsonMemberSerializationInfoProvider.cs" />
108109
<Compile Include="Serialization\Options\ArraySerializationOptions.cs" />
109110
<Compile Include="Serialization\Options\BsonBaseSerializationOptions.cs" />
110111
<Compile Include="Serialization\Options\DateTimeSerializationOptions.cs" />

Bson/Serialization/BsonClassMapSerializer.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ namespace MongoDB.Bson.Serialization
3030
/// <summary>
3131
/// Represents a serializer for a class map.
3232
/// </summary>
33-
internal class BsonClassMapSerializer : IBsonSerializer, IBsonIdProvider
33+
internal class BsonClassMapSerializer : IBsonSerializer, IBsonIdProvider, IBsonMemberSerializationInfoProvider
3434
{
3535
// private fields
3636
private BsonClassMap _classMap;
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
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+
/// Contract for composite serializers that contain a number of named serializers.
10+
/// </summary>
11+
public interface IBsonMemberSerializationInfoProvider
12+
{
13+
/// <summary>
14+
/// Gets the serialization info for a member.
15+
/// </summary>
16+
/// <param name="memberName">The member name.</param>
17+
/// <returns>The serialization info for the member.</returns>
18+
BsonSerializationInfo GetMemberSerializationInfo(string memberName);
19+
}
20+
}

Bson/Serialization/IBsonSerializer.cs

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -52,12 +52,6 @@ public interface IBsonSerializer
5252
/// <returns>The serialization info for the items.</returns>
5353
BsonSerializationInfo GetItemSerializationInfo();
5454
/// <summary>
55-
/// Gets the serialization info for a member.
56-
/// </summary>
57-
/// <param name="memberName">The member name.</param>
58-
/// <returns>The serialization info for the member.</returns>
59-
BsonSerializationInfo GetMemberSerializationInfo(string memberName);
60-
/// <summary>
6155
/// Serializes an object to a BsonWriter.
6256
/// </summary>
6357
/// <param name="bsonWriter">The BsonWriter.</param>

Bson/Serialization/Serializers/BsonBaseSerializer.cs

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -113,17 +113,6 @@ public virtual BsonSerializationInfo GetItemSerializationInfo()
113113
throw new NotSupportedException(message);
114114
}
115115

116-
/// <summary>
117-
/// Gets the serialization info for a member.
118-
/// </summary>
119-
/// <param name="memberName">The member name.</param>
120-
/// <returns>The serialization info for the member.</returns>
121-
public virtual BsonSerializationInfo GetMemberSerializationInfo(string memberName)
122-
{
123-
var message = string.Format("{0} does not implement the GetMemberSerializationInfo method.", this.GetType().Name);
124-
throw new NotSupportedException(message);
125-
}
126-
127116
/// <summary>
128117
/// Serializes an object to a BsonWriter.
129118
/// </summary>

Driver/Core/MongoDBRef.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,7 @@ public override string ToString()
193193
/// <summary>
194194
/// Represents a serializer for MongoDBRefs.
195195
/// </summary>
196-
public class MongoDBRefSerializer : BsonBaseSerializer
196+
public class MongoDBRefSerializer : BsonBaseSerializer, IBsonMemberSerializationInfoProvider
197197
{
198198
// public methods
199199
/// <summary>
@@ -255,7 +255,7 @@ public override object Deserialize(
255255
/// </summary>
256256
/// <param name="memberName">The member name.</param>
257257
/// <returns>The serialization info for the member.</returns>
258-
public override BsonSerializationInfo GetMemberSerializationInfo(string memberName)
258+
public BsonSerializationInfo GetMemberSerializationInfo(string memberName)
259259
{
260260
string elementName;
261261
IBsonSerializer serializer;

Driver/Core/SystemProfileInfo.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -328,7 +328,7 @@ public string User
328328
/// <summary>
329329
/// Represents a serializer for SystemProfileInfo.
330330
/// </summary>
331-
public class SystemProfileInfoSerializer : BsonBaseSerializer
331+
public class SystemProfileInfoSerializer : BsonBaseSerializer, IBsonMemberSerializationInfoProvider
332332
{
333333
// public methods
334334
/// <summary>
@@ -462,7 +462,7 @@ public override object Deserialize(
462462
/// </summary>
463463
/// <param name="memberName">The member name.</param>
464464
/// <returns>The serialization info for the member.</returns>
465-
public override BsonSerializationInfo GetMemberSerializationInfo(string memberName)
465+
public BsonSerializationInfo GetMemberSerializationInfo(string memberName)
466466
{
467467
string elementName;
468468
IBsonSerializer serializer;

Driver/Linq/Translators/SelectQuery.cs

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1529,11 +1529,12 @@ private BsonSerializationInfo GetSerializationInfoMember(IBsonSerializer seriali
15291529
var containingExpression = memberExpression.Expression;
15301530
if (containingExpression.NodeType == ExpressionType.Parameter)
15311531
{
1532-
try
1532+
var memberInfoProvider = serializer as IBsonMemberSerializationInfoProvider;
1533+
if(memberInfoProvider != null)
15331534
{
1534-
return serializer.GetMemberSerializationInfo(memberName);
1535+
return memberInfoProvider.GetMemberSerializationInfo(memberName);
15351536
}
1536-
catch (NotSupportedException)
1537+
else
15371538
{
15381539
var message = string.Format("LINQ queries on fields or properties of class {0} are not supported because the serializer for {0} does not implement the GetMemberSerializationInfo method.", declaringType.Name);
15391540
throw new NotSupportedException(message);
@@ -1542,16 +1543,17 @@ private BsonSerializationInfo GetSerializationInfoMember(IBsonSerializer seriali
15421543
else
15431544
{
15441545
var containingSerializationInfo = GetSerializationInfo(serializer, containingExpression);
1545-
try
1546+
var memberInfoProvider = containingSerializationInfo.Serializer as IBsonMemberSerializationInfoProvider;
1547+
if(memberInfoProvider != null)
15461548
{
1547-
var memberSerializationInfo = containingSerializationInfo.Serializer.GetMemberSerializationInfo(memberName);
1549+
var memberSerializationInfo = memberInfoProvider.GetMemberSerializationInfo(memberName);
15481550
return new BsonSerializationInfo(
15491551
containingSerializationInfo.ElementName + "." + memberSerializationInfo.ElementName,
15501552
memberSerializationInfo.Serializer,
15511553
memberSerializationInfo.NominalType,
15521554
memberSerializationInfo.SerializationOptions);
15531555
}
1554-
catch (NotSupportedException)
1556+
else
15551557
{
15561558
var message = string.Format("LINQ queries on fields or properties of class {0} are not supported because the serializer for {0} does not implement the GetMemberSerializationInfo method.", declaringType.Name);
15571559
throw new NotSupportedException(message);

0 commit comments

Comments
 (0)