Exemplo n.º 1
0
        /***************************************************/
        /**** Private Helper Methods                    ****/
        /***************************************************/

        private void SerializeDiscriminatedValue(BsonSerializationContext context, BsonSerializationArgs args, object value, Type actualType)
        {
            if (actualType.Name == "RuntimeMethodInfo" || actualType.Name == "RuntimeConstructorInfo")
            {
                actualType = typeof(MethodBase);
            }
            else if (actualType.Name == "RuntimeType")
            {
                actualType = typeof(Type);
            }
            else if (value is Enum)
            {
                actualType = typeof(Enum);
            }

            if (!BsonClassMap.IsClassMapRegistered(actualType))
            {
                Compute.RegisterClassMap(actualType);
            }

            var serializer = BsonSerializer.LookupSerializer(actualType);

            if (serializer.GetType().Name == "EnumerableInterfaceImplementerSerializer`2" && context.Writer.State == BsonWriterState.Initial)
            {
                if (!m_FallbackSerialisers.ContainsKey(actualType))
                {
                    CreateFallbackSerialiser(actualType);
                }
                serializer = m_FallbackSerialisers[actualType];
            }

            var polymorphicSerializer = serializer as IBsonPolymorphicSerializer;

            if (polymorphicSerializer != null && polymorphicSerializer.IsDiscriminatorCompatibleWithObjectSerializer)
            {
                serializer.Serialize(context, args, value);
            }
            else
            {
                if (context.IsDynamicType != null && context.IsDynamicType(value.GetType()))
                {
                    args.NominalType = actualType;
                    serializer.Serialize(context, args, value);
                }
                else
                {
                    var bsonWriter = context.Writer;
                    if (actualType.Name == "Dictionary`2")
                    {
                        Type keyType = actualType.GenericTypeArguments[0];
                        if (keyType == typeof(string))
                        {
                            serializer.Serialize(context, value);
                        }
                        else
                        {
                            DictionarySerializer dicSerialiser = new DictionarySerializer();
                            dicSerialiser.Serialize(context, value);
                        }
                    }
                    else
                    {
                        serializer.Serialize(context, value);
                    }
                }
            }
        }