Skip to content

Commit ecb9f28

Browse files
author
rstam
committed
Merge commit '64c071' into ibsonserializer
2 parents 8428628 + 64c071e commit ecb9f28

22 files changed

+194
-155
lines changed

Bson/Bson.csproj

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,10 @@
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" />
108+
<Compile Include="Serialization\IBsonIdProvider.cs" />
109+
<Compile Include="Serialization\IBsonMemberSerializationInfoProvider.cs" />
107110
<Compile Include="Serialization\Options\ArraySerializationOptions.cs" />
108111
<Compile Include="Serialization\Options\BsonBaseSerializationOptions.cs" />
109112
<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-
public class BsonClassMapSerializer : IBsonSerializer
33+
internal class BsonClassMapSerializer : IBsonSerializer, IBsonIdProvider, IBsonMemberSerializationInfoProvider
3434
{
3535
// private fields
3636
private BsonClassMap _classMap;

Bson/Serialization/IBsonIdProvider.cs

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
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 that can get and set identities.
10+
/// </summary>
11+
public interface IBsonIdProvider
12+
{
13+
/// <summary>
14+
/// Gets the document Id.
15+
/// </summary>
16+
/// <param name="document">The document.</param>
17+
/// <param name="id">The Id.</param>
18+
/// <param name="idNominalType">The nominal type of the Id.</param>
19+
/// <param name="idGenerator">The IdGenerator for the Id type.</param>
20+
/// <returns>True if the document has an Id.</returns>
21+
bool GetDocumentId(object document, out object id, out Type idNominalType, out IIdGenerator idGenerator);
22+
23+
/// <summary>
24+
/// Sets the document Id.
25+
/// </summary>
26+
/// <param name="document">The document.</param>
27+
/// <param name="id">The Id.</param>
28+
void SetDocumentId(object document, object id);
29+
}
30+
}
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+
}
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 & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -47,38 +47,12 @@ public interface IBsonSerializer
4747
/// <returns>The default serialization options for this serializer.</returns>
4848
IBsonSerializationOptions GetDefaultSerializationOptions();
4949
/// <summary>
50-
/// Gets the document Id.
51-
/// </summary>
52-
/// <param name="document">The document.</param>
53-
/// <param name="id">The Id.</param>
54-
/// <param name="idNominalType">The nominal type of the Id.</param>
55-
/// <param name="idGenerator">The IdGenerator for the Id type.</param>
56-
/// <returns>True if the document has an Id.</returns>
57-
bool GetDocumentId(object document, out object id, out Type idNominalType, out IIdGenerator idGenerator);
58-
/// <summary>
59-
/// Gets the serialization info for individual items of an enumerable type.
60-
/// </summary>
61-
/// <returns>The serialization info for the items.</returns>
62-
BsonSerializationInfo GetItemSerializationInfo();
63-
/// <summary>
64-
/// Gets the serialization info for a member.
65-
/// </summary>
66-
/// <param name="memberName">The member name.</param>
67-
/// <returns>The serialization info for the member.</returns>
68-
BsonSerializationInfo GetMemberSerializationInfo(string memberName);
69-
/// <summary>
7050
/// Serializes an object to a BsonWriter.
7151
/// </summary>
7252
/// <param name="bsonWriter">The BsonWriter.</param>
7353
/// <param name="nominalType">The nominal type.</param>
7454
/// <param name="value">The object.</param>
7555
/// <param name="options">The serialization options.</param>
7656
void Serialize(BsonWriter bsonWriter, Type nominalType, object value, IBsonSerializationOptions options);
77-
/// <summary>
78-
/// Sets the document Id.
79-
/// </summary>
80-
/// <param name="document">The document.</param>
81-
/// <param name="id">The Id.</param>
82-
void SetDocumentId(object document, object id);
8357
}
8458
}

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 & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -103,44 +103,6 @@ public virtual IBsonSerializationOptions GetDefaultSerializationOptions()
103103
return _defaultSerializationOptions;
104104
}
105105

106-
/// <summary>
107-
/// Gets the document Id.
108-
/// </summary>
109-
/// <param name="document">The document.</param>
110-
/// <param name="id">The Id.</param>
111-
/// <param name="idNominalType">The nominal type of the Id.</param>
112-
/// <param name="idGenerator">The IdGenerator for the Id type.</param>
113-
/// <returns>True if the document has an Id.</returns>
114-
public virtual bool GetDocumentId(
115-
object document,
116-
out object id,
117-
out Type idNominalType,
118-
out IIdGenerator idGenerator)
119-
{
120-
throw new NotSupportedException("Subclass must implement GetDocumentId.");
121-
}
122-
123-
/// <summary>
124-
/// Gets the serialization info for individual items of an enumerable type.
125-
/// </summary>
126-
/// <returns>The serialization info for the items.</returns>
127-
public virtual BsonSerializationInfo GetItemSerializationInfo()
128-
{
129-
var message = string.Format("{0} does not implement the GetItemSerializationInfo method.", this.GetType().Name);
130-
throw new NotSupportedException(message);
131-
}
132-
133-
/// <summary>
134-
/// Gets the serialization info for a member.
135-
/// </summary>
136-
/// <param name="memberName">The member name.</param>
137-
/// <returns>The serialization info for the member.</returns>
138-
public virtual BsonSerializationInfo GetMemberSerializationInfo(string memberName)
139-
{
140-
var message = string.Format("{0} does not implement the GetMemberSerializationInfo method.", this.GetType().Name);
141-
throw new NotSupportedException(message);
142-
}
143-
144106
/// <summary>
145107
/// Serializes an object to a BsonWriter.
146108
/// </summary>
@@ -157,16 +119,6 @@ public virtual void Serialize(
157119
throw new NotSupportedException("Subclass must implement Serialize.");
158120
}
159121

160-
/// <summary>
161-
/// Sets the document Id.
162-
/// </summary>
163-
/// <param name="document">The document.</param>
164-
/// <param name="id">The Id.</param>
165-
public virtual void SetDocumentId(object document, object id)
166-
{
167-
throw new NotSupportedException("Subclass must implement SetDocumentId.");
168-
}
169-
170122
// protected methods
171123
/// <summary>
172124
/// Ensures that the serializer has serialization options of the right type (replacing null with the default serialization options if necessary).

0 commit comments

Comments
 (0)