[CSHARP-1520] DictionaryInterfaceImplementerSerializer enum serialization bug Created: 30/Dec/15  Updated: 04/Jan/16  Resolved: 04/Jan/16

Status: Closed
Project: C# Driver
Component/s: BSON, Serialization
Affects Version/s: 2.2
Fix Version/s: None

Type: Bug Priority: Critical - P2
Reporter: Daniel Polistchuck Assignee: Unassigned
Resolution: Done Votes: 0
Labels: None
Remaining Estimate: Not Specified
Time Spent: Not Specified
Original Estimate: Not Specified
Environment:

MongoDB 3.0.7



 Description   

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.



 Comments   
Comment by Daniel Polistchuck [ 04/Jan/16 ]

Folks, please close this ticket... I have found that I need to specify the serializes for key and value like this:

BsonClassMap.RegisterClassMap<Document>(cm =>

{ cm.AutoMap(); cm.MapMember(c => c.EnabledForProduct) .SetSerializer(new DictionaryInterfaceImplementerSerializer<Dictionary<Product, bool>>(DictionaryRepresentation.ArrayOfDocuments, BsonSerializer.LookupSerializer<int>(), BsonSerializer.LookupSerializer<bool>())); }

);

Comment by Daniel Polistchuck [ 30/Dec/15 ]

I submitted the ticket without reading it through.... where it reads:

"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)"

it should read

"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), deserialize correctly"

Generated at Wed Feb 07 21:39:51 UTC 2024 using Jira 9.7.1#970001-sha1:2222b88b221c4928ef0de3161136cc90c8356a66.