Skip to content

Commit 3ccfbb1

Browse files
Dmitry NaumovRobert Stam
authored andcommitted
CSHARP-750: Fixed array of value type serialization performance issue
1 parent aa842e9 commit 3ccfbb1

File tree

2 files changed

+16
-5
lines changed

2 files changed

+16
-5
lines changed

MongoDB.Bson/IO/BsonBinaryWriter.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ public class BsonBinaryWriter : BsonWriter
3030
private bool _disposeBuffer;
3131
private BsonBinaryWriterSettings _binaryWriterSettings; // same value as in base class just declared as derived class
3232
private BsonBinaryWriterContext _context;
33+
private readonly UTF8Encoding _encoding = new UTF8Encoding(false, true);
3334

3435
// constructors
3536
/// <summary>
@@ -724,7 +725,7 @@ private void WriteNameHelper()
724725
name = Name;
725726
}
726727

727-
_buffer.WriteCString(new UTF8Encoding(false, true), name); // always use strict encoding for names
728+
_buffer.WriteCString(_encoding, name); // always use strict encoding for names
728729
}
729730
}
730731
}

MongoDB.Bson/Serialization/Serializers/ArraySerializer.cs

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -65,10 +65,14 @@ public override object Deserialize(
6565
bsonReader.ReadStartArray();
6666
var discriminatorConvention = BsonSerializer.LookupDiscriminatorConvention(typeof(T));
6767
var list = new List<T>();
68+
69+
var itemNominalType = typeof(T);
70+
var itemNominalTypeSerializer = BsonSerializer.LookupSerializer(typeof(T));
71+
6872
while (bsonReader.ReadBsonType() != BsonType.EndOfDocument)
6973
{
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);
7276
var element = (T)serializer.Deserialize(bsonReader, typeof(T), elementType, itemSerializationOptions);
7377
list.Add(element);
7478
}
@@ -136,11 +140,17 @@ public override void Serialize(
136140
var arraySerializationOptions = EnsureSerializationOptions<ArraySerializationOptions>(options);
137141
var itemSerializationOptions = arraySerializationOptions.ItemSerializationOptions;
138142

143+
var itemNominalType = typeof(T);
144+
var itemNominalTypeSerializer = BsonSerializer.LookupSerializer(itemNominalType);
145+
139146
bsonWriter.WriteStartArray();
140-
for (int index = 0; index < array.Length; index++)
147+
148+
foreach (var item in array)
141149
{
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);
143152
}
153+
144154
bsonWriter.WriteEndArray();
145155
}
146156
}

0 commit comments

Comments
 (0)