Uploaded image for project: 'C# Driver'
  1. C# Driver
  2. CSHARP-893

MongoDB.Bson.Serialization.Serializers.DictionarySerializer do not support empty string as key when CheckElementNames is true

    XMLWordPrintable

    Details

    • Type: Bug
    • Status: Closed
    • Priority: Blocker - P1
    • Resolution: Fixed
    • Affects Version/s: 1.8.3
    • Fix Version/s: 1.9
    • Component/s: Serialization
    • Labels:
    • Backwards Compatibility:
      Minor Change

      Description

      We have been running into a pretty bad bug where we noticed some objects were failing to be inserted into mongo. We were getting the following stack trace:

      System.IndexOutOfRangeException
      Index was outside the bounds of the array.
      at MongoDB.Bson.IO.BsonWriter.CheckElementName(String name)
      at MongoDB.Bson.IO.BsonWriter.WriteName(String name)
      at MongoDB.Bson.Serialization.Serializers.DictionarySerializer`2.Serialize(BsonWriter bsonWriter, Type nominalType, Object value, IBsonSerializationOptions options)
      at MongoDB.Bson.Serialization.BsonClassMapSerializer.SerializeMember(BsonWriter bsonWriter, Object obj, BsonMemberMap memberMap)
      at MongoDB.Bson.Serialization.BsonClassMapSerializer.Serialize(BsonWriter bsonWriter, Type nominalType, Object value, IBsonSerializationOptions options)
      at MongoDB.Bson.Serialization.BsonClassMapSerializer.SerializeMember(BsonWriter bsonWriter, Object obj, BsonMemberMap memberMap)
      at MongoDB.Bson.Serialization.BsonClassMapSerializer.Serialize(BsonWriter bsonWriter, Type nominalType, Object value, IBsonSerializationOptions options)
      at MongoDB.Driver.Internal.MongoInsertMessage.AddDocument(BsonBuffer buffer, Type nominalType, Object document)
      at MongoDB.Driver.Operations.InsertOperation.Execute(MongoConnection connection)
      at MongoDB.Driver.MongoCollection.InsertBatch(Type nominalType, IEnumerable documents, MongoInsertOptions options)
      at MongoDB.Driver.MongoCollection.Insert(Type nominalType, Object document, MongoInsertOptions options)

      When researching this issue we came across this: https://jira.mongodb.org/browse/CSHARP-624, which seemed like it was the issue but we were still experiencing it...

      Upon looking at the code... We tracked this down to the CheckElementName name is not checking for an empty string (just null), it's just trying to access the first character (which there are none). The following unit test reproduces this issue in the smallest amount of code possible.

      [Test]
      public void TestEmptyDictionaryKeySerialization() {
      var dictionary = new Dictionary<string, string>() {

      { "k", "v" }

      ,

      { "", "emptyKey" }

      };

      using (var buffer = new BsonBuffer()) {
      using (var bsonWriter = BsonWriter.Create(buffer, new BsonBinaryWriterSettings()))

      { bsonWriter.CheckElementNames = true; var serializer = new Bson.Serialization.Serializers.DictionarySerializer(); serializer.Serialize(bsonWriter, dictionary.GetType(), dictionary, serializer.DefaultSerializationOptions); }

      }
      }

        Attachments

          Issue Links

            Activity

              People

              Assignee:
              rstam Robert Stam
              Reporter:
              bniemyjski Blake Niemyjski
              Votes:
              1 Vote for this issue
              Watchers:
              2 Start watching this issue

                Dates

                Created:
                Updated:
                Resolved: