SerializableType CompileNonContractTypes(Type type)
        {
            // built-in type
            Encode encoder;
            Decode decoder;

            if (Encoder.TryGetCodec(type, out encoder, out decoder))
            {
                return(SerializableType.CreatePrimitiveType(type, encoder, decoder));
            }

            if (type == typeof(object))
            {
                return(SerializableType.CreateObjectType(type));
            }

            if (typeof(IAmqpSerializable).IsAssignableFrom(type))
            {
                return(SerializableType.CreateAmqpSerializableType(this, type));
            }

            if (typeof(Described).IsAssignableFrom(type))
            {
                return(SerializableType.CreateAmqpDescribedType(this, type));
            }

            SerializableType nullable = this.CompileNullableTypes(type);

            if (nullable != null)
            {
                return(nullable);
            }

            SerializableType collection = this.CompileCollectionTypes(type);

            if (collection != null)
            {
                return(collection);
            }

            return(null);
        }