예제 #1
0
        public static ElementoBinario GetSerializador(Type tipo)
        {
            ElementoBinario elemento;


            if (DicTiposBasicos.ContainsKey(tipo.AssemblyQualifiedName))
            {
                elemento = ElementoBinario.ElementoTipoAceptado(Serializar.AssemblyToEnumTipoAceptado(tipo.AssemblyQualifiedName));
            }
            else if (tipo.ImplementInterficie(typeof(IElementoBinarioComplejo)))
            {
                elemento = ((IElementoBinarioComplejo)tipo.GetObj()).Serialitzer;
                if (Equals(elemento, default))
                {
                    //significa que el Serializador se tiene que generar
                    elemento = IGetSerialitzerAuto(tipo);
                }
            }
            else if (SerializadoresTiposNoSoportados.ContainsKey(tipo.AssemblyQualifiedName))
            {
                elemento = SerializadoresTiposNoSoportados[tipo.AssemblyQualifiedName];
            }
            else
            {
                elemento = IGetSerialitzerAuto(tipo);
            }

            return(elemento);
        }
예제 #2
0
        public static bool EsCompatible(Type tipo)
        {                   //TiposMios //tener en cuenta los tipos que añaden en SerializadoresTiposNoSoportados
            bool compatible = DicTipos.ContainsKey(tipo.AssemblyQualifiedName) || SerializadoresTiposNoSoportados.ContainsKey(tipo.AssemblyQualifiedName);

            if (!compatible)   //TiposBasicos
            {
                compatible = DicTiposBasicos.ContainsKey(tipo.AssemblyQualifiedName);
            }
            if (!compatible)//Array Tipo  //  Las listas genericas mirar sus tipos
            {
                compatible = (tipo.IsArray || tipo.ImplementInterficie(typeof(IList <>))) && EsCompatible(tipo.GetElementType());
            }
            if (!compatible)//los diccionarios
            {
                compatible = tipo.IsGenericType && tipo.ImplementInterficie(typeof(IDictionary <,>)) && EsCompatible(tipo.GetGenericArguments().First()) && EsCompatible(tipo.GetGenericArguments().Last());
            }
            if (!compatible)//KeyValuePair
            {
                compatible = tipo.IsGenericType && tipo.GetGenericTypeDefinition().AssemblyQualifiedName.Equals(typeof(KeyValuePair <,>).AssemblyQualifiedName) && !tipo.GetGenericArguments().Select((t) => EsCompatible(t)).Any((esCompatible) => !esCompatible);
            }
            if (!compatible) //TwoKeys
            {
                compatible = tipo.IsGenericType && tipo.GetGenericTypeDefinition().AssemblyQualifiedName.Equals(typeof(TwoKeys <,>).AssemblyQualifiedName) && !tipo.GetGenericArguments().Select((t) => EsCompatible(t)).Any((esCompatible) => !esCompatible);
            }
            if (!compatible)
            {
                compatible = GuardarSerializadoresAutosHechos && SerializadoresElementosAutosHechos.ContainsKey(tipo.AssemblyQualifiedName);
                if (!compatible)
                {
                    //si es un tipo con propiedades compatibles es compatible
                    try
                    {   //mirar si hay recursividad infinita
                        GetElementoComplejoAuto(tipo);
                        compatible = true;
                    }
                    catch { }
                }
            }
            return(compatible);
        }