@@ -65,10 +65,14 @@ public override object Deserialize(
65
65
bsonReader . ReadStartArray ( ) ;
66
66
var discriminatorConvention = BsonSerializer . LookupDiscriminatorConvention ( typeof ( T ) ) ;
67
67
var list = new List < T > ( ) ;
68
+
69
+ var itemNominalType = typeof ( T ) ;
70
+ var itemNominalTypeSerializer = BsonSerializer . LookupSerializer ( typeof ( T ) ) ;
71
+
68
72
while ( bsonReader . ReadBsonType ( ) != BsonType . EndOfDocument )
69
73
{
70
- var elementType = discriminatorConvention . GetActualType ( bsonReader , typeof ( T ) ) ;
71
- var serializer = BsonSerializer . LookupSerializer ( elementType ) ;
74
+ var elementType = itemNominalType . IsValueType ? itemNominalType : discriminatorConvention . GetActualType ( bsonReader , typeof ( T ) ) ;
75
+ var serializer = itemNominalType . IsValueType ? itemNominalTypeSerializer : BsonSerializer . LookupSerializer ( elementType ) ;
72
76
var element = ( T ) serializer . Deserialize ( bsonReader , typeof ( T ) , elementType , itemSerializationOptions ) ;
73
77
list . Add ( element ) ;
74
78
}
@@ -136,11 +140,17 @@ public override void Serialize(
136
140
var arraySerializationOptions = EnsureSerializationOptions < ArraySerializationOptions > ( options ) ;
137
141
var itemSerializationOptions = arraySerializationOptions . ItemSerializationOptions ;
138
142
143
+ var itemNominalType = typeof ( T ) ;
144
+ var itemNominalTypeSerializer = BsonSerializer . LookupSerializer ( itemNominalType ) ;
145
+
139
146
bsonWriter . WriteStartArray ( ) ;
140
- for ( int index = 0 ; index < array . Length ; index ++ )
147
+
148
+ foreach ( var item in array )
141
149
{
142
- BsonSerializer . Serialize ( bsonWriter , typeof ( T ) , array [ index ] , itemSerializationOptions ) ;
150
+ var itemSerializer = ( itemNominalType . IsValueType || item == null ) ? itemNominalTypeSerializer : BsonSerializer . LookupSerializer ( item . GetType ( ) ) ;
151
+ itemSerializer . Serialize ( bsonWriter , itemNominalType , item , itemSerializationOptions ) ;
143
152
}
153
+
144
154
bsonWriter . WriteEndArray ( ) ;
145
155
}
146
156
}
0 commit comments