22
22
23
23
using MongoDB . Bson . IO ;
24
24
using MongoDB . Bson . Serialization ;
25
+ using MongoDB . Bson . Serialization . Options ;
25
26
26
27
namespace MongoDB . Bson . Serialization . Serializers
27
28
{
@@ -38,6 +39,7 @@ public class EnumerableSerializer : BsonBaseSerializer
38
39
/// Initializes a new instance of the EnumerableSerializer class.
39
40
/// </summary>
40
41
public EnumerableSerializer ( )
42
+ : base ( new ArraySerializationOptions ( ) )
41
43
{
42
44
}
43
45
@@ -93,6 +95,19 @@ public override object Deserialize(
93
95
}
94
96
}
95
97
98
+ /// <summary>
99
+ /// Gets the serialization info for individual items of an enumerable type.
100
+ /// </summary>
101
+ /// <returns>The serialization info for the items.</returns>
102
+ public override BsonSerializationInfo GetItemSerializationInfo ( )
103
+ {
104
+ string elementName = null ;
105
+ var serializer = BsonSerializer . LookupSerializer ( typeof ( object ) ) ;
106
+ var nominalType = typeof ( object ) ;
107
+ IBsonSerializationOptions serializationOptions = null ;
108
+ return new BsonSerializationInfo ( elementName , serializer , nominalType , serializationOptions ) ;
109
+ }
110
+
96
111
/// <summary>
97
112
/// Serializes an object to a BsonWriter.
98
113
/// </summary>
@@ -112,10 +127,14 @@ public override void Serialize(
112
127
}
113
128
else
114
129
{
130
+ var items = ( IEnumerable ) value ;
131
+ var arraySerializationOptions = EnsureSerializationOptions < ArraySerializationOptions > ( options ) ;
132
+ var itemSerializationOptions = arraySerializationOptions . ItemSerializationOptions ;
133
+
115
134
bsonWriter . WriteStartArray ( ) ;
116
- foreach ( var element in ( IEnumerable ) value )
135
+ foreach ( var item in items )
117
136
{
118
- BsonSerializer . Serialize ( bsonWriter , typeof ( object ) , element ) ;
137
+ BsonSerializer . Serialize ( bsonWriter , typeof ( object ) , item , itemSerializationOptions ) ;
119
138
}
120
139
bsonWriter . WriteEndArray ( ) ;
121
140
}
@@ -135,6 +154,7 @@ public class QueueSerializer : BsonBaseSerializer
135
154
/// Initializes a new instance of the QueueSerializer class.
136
155
/// </summary>
137
156
public QueueSerializer ( )
157
+ : base ( new ArraySerializationOptions ( ) )
138
158
{
139
159
}
140
160
@@ -190,6 +210,19 @@ public override object Deserialize(
190
210
}
191
211
}
192
212
213
+ /// <summary>
214
+ /// Gets the serialization info for individual items of an enumerable type.
215
+ /// </summary>
216
+ /// <returns>The serialization info for the items.</returns>
217
+ public override BsonSerializationInfo GetItemSerializationInfo ( )
218
+ {
219
+ string elementName = null ;
220
+ var serializer = BsonSerializer . LookupSerializer ( typeof ( object ) ) ;
221
+ var nominalType = typeof ( object ) ;
222
+ IBsonSerializationOptions serializationOptions = null ;
223
+ return new BsonSerializationInfo ( elementName , serializer , nominalType , serializationOptions ) ;
224
+ }
225
+
193
226
/// <summary>
194
227
/// Serializes an object to a BsonWriter.
195
228
/// </summary>
@@ -209,10 +242,14 @@ public override void Serialize(
209
242
}
210
243
else
211
244
{
245
+ var items = ( Queue ) value ;
246
+ var arraySerializationOptions = EnsureSerializationOptions < ArraySerializationOptions > ( options ) ;
247
+ var itemSerializationOptions = arraySerializationOptions . ItemSerializationOptions ;
248
+
212
249
bsonWriter . WriteStartArray ( ) ;
213
- foreach ( var element in ( Queue ) value )
250
+ foreach ( var item in items )
214
251
{
215
- BsonSerializer . Serialize ( bsonWriter , typeof ( object ) , element ) ;
252
+ BsonSerializer . Serialize ( bsonWriter , typeof ( object ) , item , itemSerializationOptions ) ;
216
253
}
217
254
bsonWriter . WriteEndArray ( ) ;
218
255
}
@@ -232,6 +269,7 @@ public class StackSerializer : BsonBaseSerializer
232
269
/// Initializes a new instance of the StackSerializer class.
233
270
/// </summary>
234
271
public StackSerializer ( )
272
+ : base ( new ArraySerializationOptions ( ) )
235
273
{
236
274
}
237
275
@@ -287,6 +325,19 @@ public override object Deserialize(
287
325
}
288
326
}
289
327
328
+ /// <summary>
329
+ /// Gets the serialization info for individual items of an enumerable type.
330
+ /// </summary>
331
+ /// <returns>The serialization info for the items.</returns>
332
+ public override BsonSerializationInfo GetItemSerializationInfo ( )
333
+ {
334
+ string elementName = null ;
335
+ var serializer = BsonSerializer . LookupSerializer ( typeof ( object ) ) ;
336
+ var nominalType = typeof ( object ) ;
337
+ IBsonSerializationOptions serializationOptions = null ;
338
+ return new BsonSerializationInfo ( elementName , serializer , nominalType , serializationOptions ) ;
339
+ }
340
+
290
341
/// <summary>
291
342
/// Serializes an object to a BsonWriter.
292
343
/// </summary>
@@ -306,12 +357,15 @@ public override void Serialize(
306
357
}
307
358
else
308
359
{
360
+ var items = ( ( Stack ) value ) . ToArray ( ) ; // convert to array to allow efficient access in reverse order
361
+ var arraySerializationOptions = EnsureSerializationOptions < ArraySerializationOptions > ( options ) ;
362
+ var itemSerializationOptions = arraySerializationOptions . ItemSerializationOptions ;
363
+
364
+ // serialize first pushed item first (reverse of enumeration order)
309
365
bsonWriter . WriteStartArray ( ) ;
310
- var outputOrder = new ArrayList ( ( Stack ) value ) ; // serialize first pushed item first (reverse of enumerator order)
311
- outputOrder . Reverse ( ) ;
312
- foreach ( var element in outputOrder )
366
+ for ( var i = items . Length - 1 ; i >= 0 ; i -- )
313
367
{
314
- BsonSerializer . Serialize ( bsonWriter , typeof ( object ) , element ) ;
368
+ BsonSerializer . Serialize ( bsonWriter , typeof ( object ) , items [ i ] , itemSerializationOptions ) ;
315
369
}
316
370
bsonWriter . WriteEndArray ( ) ;
317
371
}
0 commit comments