@@ -57,30 +57,34 @@ public override object Deserialize(
57
57
IBsonSerializationOptions options )
58
58
{
59
59
var bsonType = bsonReader . GetCurrentBsonType ( ) ;
60
- if ( bsonType == BsonType . Null )
60
+ switch ( bsonType )
61
61
{
62
- bsonReader . ReadNull ( ) ;
63
- return null ;
64
- }
65
- else if ( bsonType == BsonType . Array )
66
- {
67
- bsonReader . ReadStartArray ( ) ;
68
- var list = ( nominalType == typeof ( List < T > ) || nominalType . IsInterface ) ? new List < T > ( ) : ( ICollection < T > ) Activator . CreateInstance ( nominalType ) ;
69
- var discriminatorConvention = BsonDefaultSerializer . LookupDiscriminatorConvention ( typeof ( T ) ) ;
70
- while ( bsonReader . ReadBsonType ( ) != BsonType . EndOfDocument )
71
- {
72
- var elementType = discriminatorConvention . GetActualType ( bsonReader , typeof ( T ) ) ;
73
- var serializer = BsonSerializer . LookupSerializer ( elementType ) ;
74
- var element = ( T ) serializer . Deserialize ( bsonReader , typeof ( T ) , elementType , null ) ;
75
- list . Add ( element ) ;
76
- }
77
- bsonReader . ReadEndArray ( ) ;
78
- return list ;
79
- }
80
- else
81
- {
82
- var message = string . Format ( "Can't deserialize a {0} from BsonType {1}." , nominalType . FullName , bsonType ) ;
83
- throw new FileFormatException ( message ) ;
62
+ case BsonType . Null :
63
+ bsonReader . ReadNull ( ) ;
64
+ return null ;
65
+ case BsonType . Array :
66
+ bsonReader . ReadStartArray ( ) ;
67
+ var list = ( nominalType == typeof ( List < T > ) || nominalType . IsInterface ) ? new List < T > ( ) : ( ICollection < T > ) Activator . CreateInstance ( nominalType ) ;
68
+ var discriminatorConvention = BsonDefaultSerializer . LookupDiscriminatorConvention ( typeof ( T ) ) ;
69
+ while ( bsonReader . ReadBsonType ( ) != BsonType . EndOfDocument )
70
+ {
71
+ var elementType = discriminatorConvention . GetActualType ( bsonReader , typeof ( T ) ) ;
72
+ var serializer = BsonSerializer . LookupSerializer ( elementType ) ;
73
+ var element = ( T ) serializer . Deserialize ( bsonReader , typeof ( T ) , elementType , null ) ;
74
+ list . Add ( element ) ;
75
+ }
76
+ bsonReader . ReadEndArray ( ) ;
77
+ return list ;
78
+ case BsonType . Document :
79
+ bsonReader . ReadStartDocument ( ) ;
80
+ bsonReader . ReadString ( "_t" ) ; // skip over discriminator
81
+ bsonReader . ReadName ( "_v" ) ;
82
+ var value = Deserialize ( bsonReader , actualType , actualType , options ) ;
83
+ bsonReader . ReadEndDocument ( ) ;
84
+ return value ;
85
+ default :
86
+ var message = string . Format ( "Can't deserialize a {0} from BsonType {1}." , nominalType . FullName , bsonType ) ;
87
+ throw new FileFormatException ( message ) ;
84
88
}
85
89
}
86
90
@@ -116,6 +120,17 @@ public override void Serialize(
116
120
}
117
121
else
118
122
{
123
+ if ( nominalType == typeof ( object ) )
124
+ {
125
+ var actualType = value . GetType ( ) ;
126
+ bsonWriter . WriteStartDocument ( ) ;
127
+ bsonWriter . WriteString ( "_t" , TypeNameDiscriminator . GetDiscriminator ( actualType ) ) ;
128
+ bsonWriter . WriteName ( "_v" ) ;
129
+ Serialize ( bsonWriter , actualType , value , options ) ;
130
+ bsonWriter . WriteEndDocument ( ) ;
131
+ return ;
132
+ }
133
+
119
134
var items = ( IEnumerable < T > ) value ;
120
135
var arraySerializationOptions = EnsureSerializationOptions < ArraySerializationOptions > ( options ) ;
121
136
var itemSerializationOptions = arraySerializationOptions . ItemSerializationOptions ;
@@ -161,30 +176,34 @@ public override object Deserialize(
161
176
IBsonSerializationOptions options )
162
177
{
163
178
var bsonType = bsonReader . GetCurrentBsonType ( ) ;
164
- if ( bsonType == BsonType . Null )
165
- {
166
- bsonReader . ReadNull ( ) ;
167
- return null ;
168
- }
169
- else if ( bsonType == BsonType . Array )
170
- {
171
- bsonReader . ReadStartArray ( ) ;
172
- var queue = new Queue < T > ( ) ;
173
- var discriminatorConvention = BsonDefaultSerializer . LookupDiscriminatorConvention ( typeof ( T ) ) ;
174
- while ( bsonReader . ReadBsonType ( ) != BsonType . EndOfDocument )
175
- {
176
- var elementType = discriminatorConvention . GetActualType ( bsonReader , typeof ( T ) ) ;
177
- var serializer = BsonSerializer . LookupSerializer ( elementType ) ;
178
- var element = ( T ) serializer . Deserialize ( bsonReader , typeof ( T ) , elementType , null ) ;
179
- queue . Enqueue ( element ) ;
180
- }
181
- bsonReader . ReadEndArray ( ) ;
182
- return queue ;
183
- }
184
- else
179
+ switch ( bsonType )
185
180
{
186
- var message = string . Format ( "Can't deserialize a {0} from BsonType {1}." , nominalType . FullName , bsonType ) ;
187
- throw new FileFormatException ( message ) ;
181
+ case BsonType . Null :
182
+ bsonReader . ReadNull ( ) ;
183
+ return null ;
184
+ case BsonType . Array :
185
+ bsonReader . ReadStartArray ( ) ;
186
+ var queue = new Queue < T > ( ) ;
187
+ var discriminatorConvention = BsonDefaultSerializer . LookupDiscriminatorConvention ( typeof ( T ) ) ;
188
+ while ( bsonReader . ReadBsonType ( ) != BsonType . EndOfDocument )
189
+ {
190
+ var elementType = discriminatorConvention . GetActualType ( bsonReader , typeof ( T ) ) ;
191
+ var serializer = BsonSerializer . LookupSerializer ( elementType ) ;
192
+ var element = ( T ) serializer . Deserialize ( bsonReader , typeof ( T ) , elementType , null ) ;
193
+ queue . Enqueue ( element ) ;
194
+ }
195
+ bsonReader . ReadEndArray ( ) ;
196
+ return queue ;
197
+ case BsonType . Document :
198
+ bsonReader . ReadStartDocument ( ) ;
199
+ bsonReader . ReadString ( "_t" ) ; // skip over discriminator
200
+ bsonReader . ReadName ( "_v" ) ;
201
+ var value = Deserialize ( bsonReader , actualType , actualType , options ) ;
202
+ bsonReader . ReadEndDocument ( ) ;
203
+ return value ;
204
+ default :
205
+ var message = string . Format ( "Can't deserialize a {0} from BsonType {1}." , nominalType . FullName , bsonType ) ;
206
+ throw new FileFormatException ( message ) ;
188
207
}
189
208
}
190
209
@@ -220,6 +239,17 @@ public override void Serialize(
220
239
}
221
240
else
222
241
{
242
+ if ( nominalType == typeof ( object ) )
243
+ {
244
+ var actualType = value . GetType ( ) ;
245
+ bsonWriter . WriteStartDocument ( ) ;
246
+ bsonWriter . WriteString ( "_t" , TypeNameDiscriminator . GetDiscriminator ( actualType ) ) ;
247
+ bsonWriter . WriteName ( "_v" ) ;
248
+ Serialize ( bsonWriter , actualType , value , options ) ;
249
+ bsonWriter . WriteEndDocument ( ) ;
250
+ return ;
251
+ }
252
+
223
253
var items = ( Queue < T > ) value ;
224
254
var arraySerializationOptions = EnsureSerializationOptions < ArraySerializationOptions > ( options ) ;
225
255
var itemSerializationOptions = arraySerializationOptions . ItemSerializationOptions ;
@@ -265,30 +295,34 @@ public override object Deserialize(
265
295
IBsonSerializationOptions options )
266
296
{
267
297
var bsonType = bsonReader . GetCurrentBsonType ( ) ;
268
- if ( bsonType == BsonType . Null )
298
+ switch ( bsonType )
269
299
{
270
- bsonReader . ReadNull ( ) ;
271
- return null ;
272
- }
273
- else if ( bsonType == BsonType . Array )
274
- {
275
- bsonReader . ReadStartArray ( ) ;
276
- var stack = new Stack < T > ( ) ;
277
- var discriminatorConvention = BsonDefaultSerializer . LookupDiscriminatorConvention ( typeof ( T ) ) ;
278
- while ( bsonReader . ReadBsonType ( ) != BsonType . EndOfDocument )
279
- {
280
- var elementType = discriminatorConvention . GetActualType ( bsonReader , typeof ( T ) ) ;
281
- var serializer = BsonSerializer . LookupSerializer ( elementType ) ;
282
- var element = ( T ) serializer . Deserialize ( bsonReader , typeof ( T ) , elementType , null ) ;
283
- stack . Push ( element ) ;
284
- }
285
- bsonReader . ReadEndArray ( ) ;
286
- return stack ;
287
- }
288
- else
289
- {
290
- var message = string . Format ( "Can't deserialize a {0} from BsonType {1}." , nominalType . FullName , bsonType ) ;
291
- throw new FileFormatException ( message ) ;
300
+ case BsonType . Null :
301
+ bsonReader . ReadNull ( ) ;
302
+ return null ;
303
+ case BsonType . Array :
304
+ bsonReader . ReadStartArray ( ) ;
305
+ var stack = new Stack < T > ( ) ;
306
+ var discriminatorConvention = BsonDefaultSerializer . LookupDiscriminatorConvention ( typeof ( T ) ) ;
307
+ while ( bsonReader . ReadBsonType ( ) != BsonType . EndOfDocument )
308
+ {
309
+ var elementType = discriminatorConvention . GetActualType ( bsonReader , typeof ( T ) ) ;
310
+ var serializer = BsonSerializer . LookupSerializer ( elementType ) ;
311
+ var element = ( T ) serializer . Deserialize ( bsonReader , typeof ( T ) , elementType , null ) ;
312
+ stack . Push ( element ) ;
313
+ }
314
+ bsonReader . ReadEndArray ( ) ;
315
+ return stack ;
316
+ case BsonType . Document :
317
+ bsonReader . ReadStartDocument ( ) ;
318
+ bsonReader . ReadString ( "_t" ) ; // skip over discriminator
319
+ bsonReader . ReadName ( "_v" ) ;
320
+ var value = Deserialize ( bsonReader , actualType , actualType , options ) ;
321
+ bsonReader . ReadEndDocument ( ) ;
322
+ return value ;
323
+ default :
324
+ var message = string . Format ( "Can't deserialize a {0} from BsonType {1}." , nominalType . FullName , bsonType ) ;
325
+ throw new FileFormatException ( message ) ;
292
326
}
293
327
}
294
328
@@ -324,6 +358,17 @@ public override void Serialize(
324
358
}
325
359
else
326
360
{
361
+ if ( nominalType == typeof ( object ) )
362
+ {
363
+ var actualType = value . GetType ( ) ;
364
+ bsonWriter . WriteStartDocument ( ) ;
365
+ bsonWriter . WriteString ( "_t" , TypeNameDiscriminator . GetDiscriminator ( actualType ) ) ;
366
+ bsonWriter . WriteName ( "_v" ) ;
367
+ Serialize ( bsonWriter , actualType , value , options ) ;
368
+ bsonWriter . WriteEndDocument ( ) ;
369
+ return ;
370
+ }
371
+
327
372
var items = ( ( Stack < T > ) value ) . ToArray ( ) ; // convert to array to allow efficient access in reverse order
328
373
var arraySerializationOptions = EnsureSerializationOptions < ArraySerializationOptions > ( options ) ;
329
374
var itemSerializationOptions = arraySerializationOptions . ItemSerializationOptions ;
0 commit comments