static MongoBlockRepository()
        {
            var assemblies = AppDomain.CurrentDomain.GetAssemblies();

            foreach (var asm in assemblies)
            {
                foreach (var type in asm.ExportedTypes)
                {
                    var attr = type.GetTypeInfo().GetCustomAttribute <InstructionTypeAttribute>();
                    if (attr != null)
                    {
                        BsonSerializer.RegisterDiscriminator(type, new BsonString(attr.TypeIdentifier));
                        //BsonSerializer.RegisterDiscriminator(type, TypeNameDiscriminator.GetDiscriminator(type));

                        //hack for dodgy mongo driver
                        IBsonWriter w      = new BsonBinaryWriter(new MemoryStream());
                        var         constr = type.GetConstructor(new Type[0]);
                        BsonSerializer.Serialize(w, type, constr.Invoke(null));
                    }
                }
            }

            //BsonSerializer.RegisterDiscriminatorConvention(typeof(BlockTransaction), StandardDiscriminatorConvention.Scalar);


            //TypeNameDiscriminator.GetDiscriminator
            //TypeNameDiscriminator.
            //BsonSerializer.RegisterDiscriminatorConvention(typeof(object), ObjectDiscriminatorConvention.Instance);
            //BsonSerializer.RegisterDiscriminator(t, t.FullName));
        }
        private static void RegisterCustomDiscriminatorTypes(Type ClassType)
        {
            object[] regTypes = ClassType.GetCustomAttributes(typeof(MongoCustomDiscriminatorType), false);

            foreach (object regType in regTypes)
            {
                if (regType != null)
                {
                    var mongoCustomDiscriminatorType = (MongoCustomDiscriminatorType)regType;
                    BsonSerializer.RegisterDiscriminator(
                        mongoCustomDiscriminatorType.Type, mongoCustomDiscriminatorType.Type.Name);
                }
            }
        }
예제 #3
0
 /// <summary>
 /// If the type is not registered, attach it to our discriminator
 /// </summary>
 /// <param name="actualType">the type to examine</param>
 protected void RegisterNewTypesToDiscriminator(Type actualType)
 {
     // we've detected a new concrete type that isn't registered in MongoDB's serializer
     if (actualType != typeof(object) && !actualType.GetTypeInfo().IsInterface&& !BsonSerializer.IsTypeDiscriminated(actualType))
     {
         try
         {
             BsonSerializer.RegisterDiscriminatorConvention(actualType, DiscriminatorConvention);
             BsonSerializer.RegisterDiscriminator(actualType, DiscriminatorConvention.GetDiscriminator(typeof(object), actualType));
         }
         catch (BsonSerializationException)
         {
             // the MongoDB driver library has no nice mechanism for checking if a discriminator convention is registerd.
             // The "Lookup" logic tends to define a default if it doesn't exist.
             // So we're forced to eat the "duplicate registration" exception.
         }
     }
 }
예제 #4
0
 // static constructor
 static BitmapSerializer()
 {
     BsonSerializer.RegisterDiscriminator(typeof(Bitmap), "Bitmap");
 }
예제 #5
0
        // from MongoDB.Bson.Serialization.BsonDefaultSerializationProvider.GetCollectionSerializer()
        private IBsonSerializer GetCollectionSerializer(Type type)
        {
            Type implementedGenericDictionaryInterface = null;
            Type implementedGenericEnumerableInterface = null;
            Type implementedDictionaryInterface        = null;
            Type implementedEnumerableInterface        = null;

            var implementedInterfaces = new List <Type>(type.GetInterfaces());

            if (type.IsInterface)
            {
                implementedInterfaces.Add(type);
            }
            foreach (var implementedInterface in implementedInterfaces)
            {
                if (implementedInterface.IsGenericType)
                {
                    var genericInterfaceDefinition = implementedInterface.GetGenericTypeDefinition();
                    if (genericInterfaceDefinition == typeof(IDictionary <,>))
                    {
                        implementedGenericDictionaryInterface = implementedInterface;
                    }
                    if (genericInterfaceDefinition == typeof(IEnumerable <>))
                    {
                        implementedGenericEnumerableInterface = implementedInterface;
                    }
                }
                else
                {
                    if (implementedInterface == typeof(IDictionary))
                    {
                        implementedDictionaryInterface = implementedInterface;
                    }
                    if (implementedInterface == typeof(IEnumerable))
                    {
                        implementedEnumerableInterface = implementedInterface;
                    }
                }
            }

            // the order of the tests is important
            if (implementedGenericDictionaryInterface != null)
            {
                var keyType   = implementedGenericDictionaryInterface.GetGenericArguments()[0];
                var valueType = implementedGenericDictionaryInterface.GetGenericArguments()[1];
                //var genericSerializerDefinition = typeof(DictionarySerializer<,>);
                var genericSerializerDefinition = BsonSerializer.LookupGenericSerializerDefinition(typeof(Dictionary <,>));
                if (genericSerializerDefinition == null)
                {
                    //throw new PBException("error missing generic dictionary serializer");
                    genericSerializerDefinition = typeof(DictionarySerializer <,>);
                }
                var genericSerializerType = genericSerializerDefinition.MakeGenericType(keyType, valueType);
                return((IBsonSerializer)Activator.CreateInstance(genericSerializerType));
            }
            else if (implementedDictionaryInterface != null)
            {
                IBsonSerializer serializer = BsonSerializer.LookupSerializer(typeof(IDictionary));
                if (serializer != null)
                {
                    return(serializer);
                }
                return(new DictionarySerializer());
            }
            else if (implementedGenericEnumerableInterface != null)
            {
                var  valueType = implementedGenericEnumerableInterface.GetGenericArguments()[0];
                var  readOnlyCollectionType = typeof(ReadOnlyCollection <>).MakeGenericType(valueType);
                Type genericSerializerDefinition;
                if (readOnlyCollectionType.IsAssignableFrom(type))
                {
                    //genericSerializerDefinition = typeof(ReadOnlyCollectionSerializer<>);
                    genericSerializerDefinition = BsonSerializer.LookupGenericSerializerDefinition(typeof(ReadOnlyCollection <>));
                    if (genericSerializerDefinition == null)
                    {
                        genericSerializerDefinition = typeof(ReadOnlyCollectionSerializer <>);
                    }
                    if (type != readOnlyCollectionType)
                    {
                        BsonSerializer.RegisterDiscriminator(type, type.Name);
                    }
                }
                else
                {
                    //genericSerializerDefinition = typeof(EnumerableSerializer<>);
                    genericSerializerDefinition = BsonSerializer.LookupGenericSerializerDefinition(typeof(IEnumerable <>));
                    if (genericSerializerDefinition == null)
                    {
                        genericSerializerDefinition = typeof(EnumerableSerializer <>);
                    }
                }
                var genericSerializerType = genericSerializerDefinition.MakeGenericType(valueType);
                return((IBsonSerializer)Activator.CreateInstance(genericSerializerType));
            }
            else if (implementedEnumerableInterface != null)
            {
                IBsonSerializer serializer = BsonSerializer.LookupSerializer(typeof(IEnumerable));
                if (serializer != null)
                {
                    return(serializer);
                }
                return(new EnumerableSerializer());
            }

            return(null);
        }