Skip to content

Commit 8751b77

Browse files
author
rstam
committed
Fixed CSHARP-479. Deserialize method of the ArraySerializer(s) was not passing along the ItemSerializationOptions to the item deserializer.
1 parent 56c9ee8 commit 8751b77

File tree

1 file changed

+18
-3
lines changed

1 file changed

+18
-3
lines changed

Bson/Serialization/Serializers/ArraySerializer.cs

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,8 @@ public override object Deserialize(
5757
IBsonSerializationOptions options)
5858
{
5959
VerifyTypes(nominalType, actualType, typeof(T[]));
60+
var arraySerializationOptions = EnsureSerializationOptions<ArraySerializationOptions>(options);
61+
var itemSerializationOptions = arraySerializationOptions.ItemSerializationOptions;
6062

6163
var bsonType = bsonReader.GetCurrentBsonType();
6264
switch (bsonType)
@@ -66,10 +68,13 @@ public override object Deserialize(
6668
return null;
6769
case BsonType.Array:
6870
bsonReader.ReadStartArray();
71+
var discriminatorConvention = BsonSerializer.LookupDiscriminatorConvention(typeof(T));
6972
var list = new List<T>();
7073
while (bsonReader.ReadBsonType() != BsonType.EndOfDocument)
7174
{
72-
var element = BsonSerializer.Deserialize<T>(bsonReader);
75+
var elementType = discriminatorConvention.GetActualType(bsonReader, typeof(T));
76+
var serializer = BsonSerializer.LookupSerializer(elementType);
77+
var element = (T)serializer.Deserialize(bsonReader, typeof(T), elementType, itemSerializationOptions);
7378
list.Add(element);
7479
}
7580
bsonReader.ReadEndArray();
@@ -177,6 +182,8 @@ public override object Deserialize(
177182
IBsonSerializationOptions options)
178183
{
179184
VerifyTypes(nominalType, actualType, typeof(T[,]));
185+
var arraySerializationOptions = EnsureSerializationOptions<ArraySerializationOptions>(options);
186+
var itemSerializationOptions = arraySerializationOptions.ItemSerializationOptions;
180187

181188
var bsonType = bsonReader.GetCurrentBsonType();
182189
string message;
@@ -187,14 +194,17 @@ public override object Deserialize(
187194
return null;
188195
case BsonType.Array:
189196
bsonReader.ReadStartArray();
197+
var discriminatorConvention = BsonSerializer.LookupDiscriminatorConvention(typeof(T));
190198
var outerList = new List<List<T>>();
191199
while (bsonReader.ReadBsonType() != BsonType.EndOfDocument)
192200
{
193201
bsonReader.ReadStartArray();
194202
var innerList = new List<T>();
195203
while (bsonReader.ReadBsonType() != BsonType.EndOfDocument)
196204
{
197-
var element = BsonSerializer.Deserialize<T>(bsonReader);
205+
var elementType = discriminatorConvention.GetActualType(bsonReader, typeof(T));
206+
var serializer = BsonSerializer.LookupSerializer(elementType);
207+
var element = (T)serializer.Deserialize(bsonReader, typeof(T), elementType, itemSerializationOptions);
198208
innerList.Add(element);
199209
}
200210
bsonReader.ReadEndArray();
@@ -317,6 +327,8 @@ public override object Deserialize(
317327
IBsonSerializationOptions options)
318328
{
319329
VerifyTypes(nominalType, actualType, typeof(T[, ,]));
330+
var arraySerializationOptions = EnsureSerializationOptions<ArraySerializationOptions>(options);
331+
var itemSerializationOptions = arraySerializationOptions.ItemSerializationOptions;
320332

321333
var bsonType = bsonReader.GetCurrentBsonType();
322334
string message;
@@ -327,6 +339,7 @@ public override object Deserialize(
327339
return null;
328340
case BsonType.Array:
329341
bsonReader.ReadStartArray();
342+
var discriminatorConvention = BsonSerializer.LookupDiscriminatorConvention(typeof(T));
330343
var outerList = new List<List<List<T>>>();
331344
while (bsonReader.ReadBsonType() != BsonType.EndOfDocument)
332345
{
@@ -338,7 +351,9 @@ public override object Deserialize(
338351
var innerList = new List<T>();
339352
while (bsonReader.ReadBsonType() != BsonType.EndOfDocument)
340353
{
341-
var element = BsonSerializer.Deserialize<T>(bsonReader);
354+
var elementType = discriminatorConvention.GetActualType(bsonReader, typeof(T));
355+
var serializer = BsonSerializer.LookupSerializer(elementType);
356+
var element = (T)serializer.Deserialize(bsonReader, typeof(T), elementType, itemSerializationOptions);
342357
innerList.Add(element);
343358
}
344359
bsonReader.ReadEndArray();

0 commit comments

Comments
 (0)