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

DictionaryInterfaceImplementerSerializer enum serialization bug

    • Type: Icon: Bug Bug
    • Resolution: Done
    • Priority: Icon: Critical - P2 Critical - P2
    • None
    • Affects Version/s: 2.2
    • Component/s: BSON, Serialization
    • Labels:
      None
    • Environment:
      MongoDB 3.0.7

      After migrating form driver 1.x to 2.x (2.2.0), we faced an issue with the

      DictionaryInterfaceImplementerSerializer using DictionaryRepresentation.ArrayOfDocuments

      where the dictionary is a

      Dictionary<MyEnumeration, bool>.

      The following stacktrace was generated for some documents:

      System.FormatException : An error occurred while deserializing the EnabledForProduct property of class CredMarket.Model.Branch: O valor "0" não é do tipo "CredMarket.Model.Product" e não pode ser usado nesta coleção genérica.
      Nome do parâmetro: key
      ----> System.ArgumentException : O valor "0" não é do tipo "CredMarket.Model.Product" e não pode ser usado nesta coleção genérica.
      Nome do parâmetro: key
      em MongoDB.Bson.Serialization.BsonClassMapSerializer`1.DeserializeMemberValue(BsonDeserializationContext context, BsonMemberMap memberMap)
      em MongoDB.Bson.Serialization.BsonClassMapSerializer`1.DeserializeClass(BsonDeserializationContext context)
      em MongoDB.Bson.Serialization.BsonClassMapSerializer`1.Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args)
      em MongoDB.Bson.Serialization.IBsonSerializerExtensions.Deserialize(IBsonSerializer`1 serializer, BsonDeserializationContext context)
      em MongoDB.Driver.Core.WireProtocol.Messages.Encoders.BinaryEncoders.ReplyMessageBinaryEncoder`1.ReadMessage()
      em MongoDB.Driver.Core.Connections.BinaryConnection.ReceiveMessageHelper.DecodeMessage(IByteBuffer buffer, IMessageEncoderSelector encoderSelector, CancellationToken cancellationToken)
      em MongoDB.Driver.Core.Connections.BinaryConnection.ReceiveMessage(Int32 responseTo, IMessageEncoderSelector encoderSelector, MessageEncoderSettings messageEncoderSettings, CancellationToken cancellationToken)
      em MongoDB.Driver.Core.ConnectionPools.ExclusiveConnectionPool.AcquiredConnection.ReceiveMessage(Int32 responseTo, IMessageEncoderSelector encoderSelector, MessageEncoderSettings messageEncoderSettings, CancellationToken cancellationToken)
      em MongoDB.Driver.Core.WireProtocol.QueryWireProtocol`1.Execute(IConnection connection, CancellationToken cancellationToken)
      em MongoDB.Driver.Core.Servers.ClusterableServer.ServerChannel.ExecuteProtocol(IWireProtocol`1 protocol, CancellationToken cancellationToken)
      em MongoDB.Driver.Core.Servers.ClusterableServer.ServerChannel.Query(CollectionNamespace collectionNamespace, BsonDocument query, BsonDocument fields, IElementNameValidator queryValidator, Int32 skip, Int32 batchSize, Boolean slaveOk, Boolean partialOk, Boolean noCursorTimeout, Boolean oplogReplay, Boolean tailableCursor, Boolean awaitData, IBsonSerializer`1 serializer, MessageEncoderSettings messageEncoderSettings, CancellationToken cancellationToken)
      em MongoDB.Driver.Core.Operations.FindOpcodeOperation`1.ExecuteProtocol(IChannelHandle channel, BsonDocument wrappedQuery, Boolean slaveOk, CancellationToken cancellationToken)
      em MongoDB.Driver.Core.Operations.FindOpcodeOperation`1.Execute(IReadBinding binding, CancellationToken cancellationToken)
      em MongoDB.Driver.Core.Operations.FindOperation`1.Execute(IReadBinding binding, CancellationToken cancellationToken)
      em MongoDB.Driver.OperationExecutor.ExecuteReadOperation(IReadBinding binding, IReadOperation`1 operation, CancellationToken cancellationToken)
      em MongoDB.Driver.MongoCollectionImpl`1.ExecuteReadOperation(IReadOperation`1 operation, ReadPreference readPreference, CancellationToken cancellationToken)
      em MongoDB.Driver.MongoCollectionImpl`1.ExecuteReadOperation(IReadOperation`1 operation, CancellationToken cancellationToken)
      em MongoDB.Driver.MongoCollectionImpl`1.FindSync(FilterDefinition`1 filter, FindOptions`2 options, CancellationToken cancellationToken)
      em MongoDB.Driver.FindFluent`2.ToCursor(CancellationToken cancellationToken)
      em MongoDB.Driver.IAsyncCursorSourceExtensions.FirstOrDefault(IAsyncCursorSource`1 source, CancellationToken cancellationToken)
      em MongoDB.Driver.IFindFluentExtensions.FirstOrDefault(IFindFluent`2 find, CancellationToken cancellationToken)
      em CredMarket.Repository.MongoDB.SimpleRepository`1.FindOne(FilterDefinition`1 f) na SimpleRepository.cs: line 99
      em CredMarket.Repository.MongoDB.SimpleRepository`1.GetById(String id) na SimpleRepository.cs: line 105
      em CredMarket.Tests.TestMongoDB2Serialization.TestBranchSerialization() na TestMongoDB2Serialization.cs: line 67
      --ArgumentException
      em System.ThrowHelper.ThrowWrongKeyTypeArgumentException(Object key, Type targetType)
      em System.Collections.Generic.Dictionary`2.System.Collections.IDictionary.Add(Object key, Object value)
      em MongoDB.Bson.Serialization.Serializers.DictionarySerializerBase`1.DeserializeArrayRepresentation(BsonDeserializationContext context)
      em MongoDB.Bson.Serialization.Serializers.DictionarySerializerBase`1.DeserializeValue(BsonDeserializationContext context, BsonDeserializationArgs args)
      em MongoDB.Bson.Serialization.Serializers.ClassSerializerBase`1.Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args)
      em MongoDB.Bson.Serialization.Serializers.SerializerBase`1.MongoDB.Bson.Serialization.IBsonSerializer.Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args)
      em MongoDB.Bson.Serialization.IBsonSerializerExtensions.Deserialize(IBsonSerializer serializer, BsonDeserializationContext context)
      em MongoDB.Bson.Serialization.BsonClassMapSerializer`1.DeserializeMemberValue(BsonDeserializationContext context, BsonMemberMap memberMap)

      We nailed down the error to documents where the enum was of the underyling bson type "1" (Double). Documents with underlying bson type of "16" (Int 32)

      This issue does not happen with the 1.x driver.

            Assignee:
            Unassigned Unassigned
            Reporter:
            danielp@bompracredito.com.br Daniel Polistchuck
            Votes:
            0 Vote for this issue
            Watchers:
            1 Start watching this issue

              Created:
              Updated:
              Resolved: