protected Serializer loadSerializer()

in hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/SerializerFactory.java [343:431]


    protected Serializer loadSerializer(Class<?> cl)
            throws HessianProtocolException {
        Serializer serializer = null;

        for (int i = 0;
             _factories != null && i < _factories.size();
             i++) {
            AbstractSerializerFactory factory;

            factory = (AbstractSerializerFactory) _factories.get(i);

            serializer = factory.getSerializer(cl);

            if (serializer != null)
                return serializer;
        }

        serializer = _contextFactory.getSerializer(cl.getName());

        if (serializer != null)
            return serializer;

        ClassLoader loader = cl.getClassLoader();

        if (loader == null)
            loader = _systemClassLoader;

        ContextSerializerFactory factory = null;

        factory = ContextSerializerFactory.create(loader);

        serializer = factory.getCustomSerializer(cl);

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

        if (HessianRemoteObject.class.isAssignableFrom(cl)) {
            return new RemoteSerializer();
        } else if (InetAddress.class.isAssignableFrom(cl)) {
            return InetAddressSerializer.create();
        } else if (isZoneId(cl)) //must before "else if (JavaSerializer.getWriteReplace(cl) != null)"
            return ZoneIdSerializer.getInstance();
        else if (JavaSerializer.getWriteReplace(cl) != null) {
            Serializer baseSerializer = getDefaultSerializer(cl);

            return new WriteReplaceSerializer(cl, getClassLoader(), baseSerializer);
        } else if (Map.class.isAssignableFrom(cl)) {
            if (_mapSerializer == null)
                _mapSerializer = new MapSerializer();

            return _mapSerializer;
        } else if (Collection.class.isAssignableFrom(cl)) {
            if (_collectionSerializer == null) {
                _collectionSerializer = new CollectionSerializer();
            }

            return _collectionSerializer;
        } else if (cl.isArray()) {
            return new ArraySerializer();
        } else if (Throwable.class.isAssignableFrom(cl))
            return new ThrowableSerializer(getDefaultSerializer(cl));

        else if (InputStream.class.isAssignableFrom(cl))
            return new InputStreamSerializer();

        else if (Iterator.class.isAssignableFrom(cl))
            return IteratorSerializer.create();

        else if (Calendar.class.isAssignableFrom(cl))
            return CalendarSerializer.SER;

        else if (Enumeration.class.isAssignableFrom(cl))
            return EnumerationSerializer.create();

        else if (Enum.class.isAssignableFrom(cl))
            return new EnumSerializer(cl);

        else if (Annotation.class.isAssignableFrom(cl))
            return new AnnotationSerializer(cl);

        else if (BitSet.class.isAssignableFrom(cl))
            return BitSetSerializer.create();

        else if (RecordUtil.isRecord(cl))
            return new RecordSerializer(cl);

        return getDefaultSerializer(cl);
    }