Skip to content

Commit 64c071e

Browse files
committed
refactored IBsonSerializer to not be aware of items so that implementors don't need to implement methods that don't apply.
1 parent c73b68f commit 64c071e

12 files changed

+107
-42
lines changed

Bson/Bson.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,7 @@
103103
<Compile Include="Serialization\Conventions\IgnoreIfDefaultConventions.cs" />
104104
<Compile Include="Serialization\Conventions\SerializationOptionsConventions.cs" />
105105
<Compile Include="Serialization\IBsonClassMapModifier.cs" />
106+
<Compile Include="Serialization\IBsonItemSerializationInfoProvider.cs" />
106107
<Compile Include="Serialization\IBsonMemberMapModifier.cs" />
107108
<Compile Include="Serialization\IBsonIdProvider.cs" />
108109
<Compile Include="Serialization\IBsonMemberSerializationInfoProvider.cs" />
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
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 serializers to implement if they serialize an array of items.
10+
/// </summary>
11+
public interface IBsonItemSerializationInfoProvider
12+
{
13+
/// <summary>
14+
/// Gets the serialization info for individual items of an enumerable type.
15+
/// </summary>
16+
/// <returns>The serialization info for the items.</returns>
17+
BsonSerializationInfo GetItemSerializationInfo();
18+
}
19+
}

Bson/Serialization/IBsonSerializer.cs

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -47,11 +47,6 @@ public interface IBsonSerializer
4747
/// <returns>The default serialization options for this serializer.</returns>
4848
IBsonSerializationOptions GetDefaultSerializationOptions();
4949
/// <summary>
50-
/// Gets the serialization info for individual items of an enumerable type.
51-
/// </summary>
52-
/// <returns>The serialization info for the items.</returns>
53-
BsonSerializationInfo GetItemSerializationInfo();
54-
/// <summary>
5550
/// Serializes an object to a BsonWriter.
5651
/// </summary>
5752
/// <param name="bsonWriter">The BsonWriter.</param>

Bson/Serialization/Options/ArraySerializationOptions.cs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,17 @@ public IBsonSerializationOptions ItemSerializationOptions
7171
public override void ApplyAttribute(IBsonSerializer serializer, Attribute attribute)
7272
{
7373
EnsureNotFrozen();
74-
var itemSerializer = serializer.GetItemSerializationInfo().Serializer;
74+
var itemSerializationProvider = serializer as IBsonItemSerializationInfoProvider;
75+
if (itemSerializationProvider == null)
76+
{
77+
var message = string.Format(
78+
"A serialization options attribute of type {0} cannot be used when the serializer is of type {1}.",
79+
BsonUtils.GetFriendlyTypeName(attribute.GetType()),
80+
BsonUtils.GetFriendlyTypeName(serializer.GetType()));
81+
throw new NotSupportedException(message);
82+
}
83+
84+
var itemSerializer = itemSerializationProvider.GetItemSerializationInfo().Serializer;
7585
if (_itemSerializationOptions == null)
7686
{
7787
var itemDefaultSerializationOptions = itemSerializer.GetDefaultSerializationOptions();

Bson/Serialization/Options/DictionarySerializationOptions.cs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,17 @@ public override void ApplyAttribute(IBsonSerializer serializer, Attribute attrib
188188
}
189189
}
190190

191-
var itemSerializer = serializer.GetItemSerializationInfo().Serializer;
191+
var itemSerializationProvider = serializer as IBsonItemSerializationInfoProvider;
192+
if (itemSerializationProvider == null)
193+
{
194+
var message = string.Format(
195+
"A serialization options attribute of type {0} cannot be used when the serializer is of type {1}.",
196+
BsonUtils.GetFriendlyTypeName(attribute.GetType()),
197+
BsonUtils.GetFriendlyTypeName(serializer.GetType()));
198+
throw new NotSupportedException(message);
199+
}
200+
201+
var itemSerializer = itemSerializationProvider.GetItemSerializationInfo().Serializer;
192202
if (_itemSerializationOptions == null)
193203
{
194204
var itemDefaultSerializationOptions = itemSerializer.GetDefaultSerializationOptions();

Bson/Serialization/Serializers/ArraySerializer.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ namespace MongoDB.Bson.Serialization.Serializers
3030
/// Represents a serializer for one-dimensional arrays.
3131
/// </summary>
3232
/// <typeparam name="T">The type of the elements.</typeparam>
33-
public class ArraySerializer<T> : BsonBaseSerializer
33+
public class ArraySerializer<T> : BsonBaseSerializer, IBsonItemSerializationInfoProvider
3434
{
3535
// constructors
3636
/// <summary>
@@ -91,7 +91,7 @@ public override object Deserialize(
9191
/// Gets the serialization info for individual items of an enumerable type.
9292
/// </summary>
9393
/// <returns>The serialization info for the items.</returns>
94-
public override BsonSerializationInfo GetItemSerializationInfo()
94+
public BsonSerializationInfo GetItemSerializationInfo()
9595
{
9696
string elementName = null;
9797
var serializer = BsonSerializer.LookupSerializer(typeof(T));

Bson/Serialization/Serializers/BsonBaseSerializer.cs

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -103,16 +103,6 @@ public virtual IBsonSerializationOptions GetDefaultSerializationOptions()
103103
return _defaultSerializationOptions;
104104
}
105105

106-
/// <summary>
107-
/// Gets the serialization info for individual items of an enumerable type.
108-
/// </summary>
109-
/// <returns>The serialization info for the items.</returns>
110-
public virtual BsonSerializationInfo GetItemSerializationInfo()
111-
{
112-
var message = string.Format("{0} does not implement the GetItemSerializationInfo method.", this.GetType().Name);
113-
throw new NotSupportedException(message);
114-
}
115-
116106
/// <summary>
117107
/// Serializes an object to a BsonWriter.
118108
/// </summary>

Bson/Serialization/Serializers/CollectionGenericSerializers.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ namespace MongoDB.Bson.Serialization.Serializers
3030
/// Represents a serializer for enumerable values.
3131
/// </summary>
3232
/// <typeparam name="T">The type of the elements.</typeparam>
33-
public class EnumerableSerializer<T> : BsonBaseSerializer
33+
public class EnumerableSerializer<T> : BsonBaseSerializer, IBsonItemSerializationInfoProvider
3434
{
3535
// constructors
3636
/// <summary>
@@ -92,7 +92,7 @@ public override object Deserialize(
9292
/// Gets the serialization info for individual items of an enumerable type.
9393
/// </summary>
9494
/// <returns>The serialization info for the items.</returns>
95-
public override BsonSerializationInfo GetItemSerializationInfo()
95+
public BsonSerializationInfo GetItemSerializationInfo()
9696
{
9797
string elementName = null;
9898
var serializer = BsonSerializer.LookupSerializer(typeof(T));
@@ -149,7 +149,7 @@ public override void Serialize(
149149
/// Represents a serializer for Queues.
150150
/// </summary>
151151
/// <typeparam name="T">The type of the elements.</typeparam>
152-
public class QueueSerializer<T> : BsonBaseSerializer
152+
public class QueueSerializer<T> : BsonBaseSerializer, IBsonItemSerializationInfoProvider
153153
{
154154
// constructors
155155
/// <summary>
@@ -211,7 +211,7 @@ public override object Deserialize(
211211
/// Gets the serialization info for individual items of an enumerable type.
212212
/// </summary>
213213
/// <returns>The serialization info for the items.</returns>
214-
public override BsonSerializationInfo GetItemSerializationInfo()
214+
public BsonSerializationInfo GetItemSerializationInfo()
215215
{
216216
string elementName = null;
217217
var serializer = BsonSerializer.LookupSerializer(typeof(T));
@@ -268,7 +268,7 @@ public override void Serialize(
268268
/// Represents a serializer for Stacks.
269269
/// </summary>
270270
/// <typeparam name="T">The type of the elements.</typeparam>
271-
public class StackSerializer<T> : BsonBaseSerializer
271+
public class StackSerializer<T> : BsonBaseSerializer, IBsonItemSerializationInfoProvider
272272
{
273273
// constructors
274274
/// <summary>
@@ -330,7 +330,7 @@ public override object Deserialize(
330330
/// Gets the serialization info for individual items of an enumerable type.
331331
/// </summary>
332332
/// <returns>The serialization info for the items.</returns>
333-
public override BsonSerializationInfo GetItemSerializationInfo()
333+
public BsonSerializationInfo GetItemSerializationInfo()
334334
{
335335
string elementName = null;
336336
var serializer = BsonSerializer.LookupSerializer(typeof(T));

Bson/Serialization/Serializers/CollectionSerializers.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ namespace MongoDB.Bson.Serialization.Serializers
2929
/// <summary>
3030
/// Represents a serializer for enumerable values.
3131
/// </summary>
32-
public class EnumerableSerializer : BsonBaseSerializer
32+
public class EnumerableSerializer : BsonBaseSerializer, IBsonItemSerializationInfoProvider
3333
{
3434
// private static fields
3535
private static EnumerableSerializer __instance = new EnumerableSerializer();
@@ -103,7 +103,7 @@ public override object Deserialize(
103103
/// Gets the serialization info for individual items of an enumerable type.
104104
/// </summary>
105105
/// <returns>The serialization info for the items.</returns>
106-
public override BsonSerializationInfo GetItemSerializationInfo()
106+
public BsonSerializationInfo GetItemSerializationInfo()
107107
{
108108
string elementName = null;
109109
var serializer = BsonSerializer.LookupSerializer(typeof(object));
@@ -159,7 +159,7 @@ public override void Serialize(
159159
/// <summary>
160160
/// Represents a serializer for Queues.
161161
/// </summary>
162-
public class QueueSerializer : BsonBaseSerializer
162+
public class QueueSerializer : BsonBaseSerializer, IBsonItemSerializationInfoProvider
163163
{
164164
// private static fields
165165
private static QueueSerializer __instance = new QueueSerializer();
@@ -233,7 +233,7 @@ public override object Deserialize(
233233
/// Gets the serialization info for individual items of an enumerable type.
234234
/// </summary>
235235
/// <returns>The serialization info for the items.</returns>
236-
public override BsonSerializationInfo GetItemSerializationInfo()
236+
public BsonSerializationInfo GetItemSerializationInfo()
237237
{
238238
string elementName = null;
239239
var serializer = BsonSerializer.LookupSerializer(typeof(object));
@@ -289,7 +289,7 @@ public override void Serialize(
289289
/// <summary>
290290
/// Represents a serializer for Stacks.
291291
/// </summary>
292-
public class StackSerializer : BsonBaseSerializer
292+
public class StackSerializer : BsonBaseSerializer, IBsonItemSerializationInfoProvider
293293
{
294294
// private static fields
295295
private static StackSerializer __instance = new StackSerializer();
@@ -363,7 +363,7 @@ public override object Deserialize(
363363
/// Gets the serialization info for individual items of an enumerable type.
364364
/// </summary>
365365
/// <returns>The serialization info for the items.</returns>
366-
public override BsonSerializationInfo GetItemSerializationInfo()
366+
public BsonSerializationInfo GetItemSerializationInfo()
367367
{
368368
string elementName = null;
369369
var serializer = BsonSerializer.LookupSerializer(typeof(object));

Bson/Serialization/Serializers/DictionaryGenericSerializer.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ namespace MongoDB.Bson.Serialization.Serializers
3030
/// </summary>
3131
/// <typeparam name="TKey">The type of the keys.</typeparam>
3232
/// <typeparam name="TValue">The type of the values.</typeparam>
33-
public class DictionarySerializer<TKey, TValue> : BsonBaseSerializer
33+
public class DictionarySerializer<TKey, TValue> : BsonBaseSerializer, IBsonItemSerializationInfoProvider
3434
{
3535
// constructors
3636
/// <summary>
@@ -170,7 +170,7 @@ public override object Deserialize(
170170
/// Gets the serialization info for individual items of an enumerable type.
171171
/// </summary>
172172
/// <returns>The serialization info for the items.</returns>
173-
public override BsonSerializationInfo GetItemSerializationInfo()
173+
public BsonSerializationInfo GetItemSerializationInfo()
174174
{
175175
string elementName = null;
176176
var serializer = BsonSerializer.LookupSerializer(typeof(TValue));

0 commit comments

Comments
 (0)