BsonClassMapSerializer is already registered for AbstractClassSerializer

I am using Mongo C # driver 2.0 and am running into BsonSerializer registration problems when registering AbstractClassSerializers for my Id value objects.

MongoDB.Bson.BsonSerializationException: A serializer already exists registered for the HistoricalEventId type.

When I look into the BsonSerializer, I see that the BsoClassMapSerializer is already registered for my type.

enter image description here

I am assuming a BsonClassMapSerializer is created for my entity types and it also creates a BsonClassMapSerializer for the Id field. Has anyone encountered this before? After that, the Bson serializer code is shown below if it helps.

Sorry if the formatting is wrong, C # doesn't seem to display well.

HistoricalEventIdBsonSerializer

public class HistoricalEventIdBsonSerializer : ToObjectIdBsonSerializer<HistoricalEventId>
{
    public override HistoricalEventId CreateObjectFromObjectId(ObjectId serializedObj)
    {
        HistoricalEventId parsedObj;
        HistoricalEventId.TryParse(serializedObj, out parsedObj);
        return parsedObj;
    }
}

      

ToObjectIdBsonSerializer

public abstract class ToObjectIdBsonSerializer<T> : AbstractClassSerializer<T> where T : class
{
    private static readonly Type _convertibleType = typeof(IConvertible<ObjectId>);
    public abstract T CreateObjectFromObjectId(ObjectId serializedObj);

    public override T Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args)
    {
        var bsonType = context.Reader.GetCurrentBsonType();
        ObjectId value;
        switch (bsonType)
        {
            case BsonType.Undefined:
                value = ObjectId.Empty;
                context.Reader.ReadUndefined();
                break;
            case BsonType.Null:
                value = ObjectId.Empty;
                context.Reader.ReadNull();
                break;
            case BsonType.ObjectId:
                value = context.Reader.ReadObjectId();
                break;
            case BsonType.String:
                value = new ObjectId(context.Reader.ReadString());
                break;
            default:
                throw new NotSupportedException("Unable to create the type " + 
                    args.NominalType.Name + " from the bson type " + bsonType + ".");
        }
        return this.CreateObjectFromObjectId(value);
    }

    public override void Serialize(BsonSerializationContext context, BsonSerializationArgs args, T value)
    {
        if (value == null)
        {
            context.Writer.WriteObjectId(ObjectId.Empty);
        }
        else
        {
            if (!_convertibleType.IsAssignableFrom(args.NominalType))
            {
                throw new NotSupportedException("The type " + args.NominalType.Name + 
                    " must implement the " + _convertibleType.Name + " interface.");
            }
            var typedObj = (IConvertible<ObjectId>)value;
            context.Writer.WriteObjectId(typedObj.ToValueType());
        }
    }

}

      

IConvertible

public interface IConvertible<out T>
{
    T ToValueType();
}

      

+3


source to share


1 answer


My guess must be correct because I just fixed it by registering the BsonSerializer before creating the MongoClient and getting the database. Hope this helps someone else.



+3


source







All Articles