protected FieldMarshal fieldMarshal(StructInfo info, Field field)
    {
        Class<?> fieldType = field.getType();

        if (fieldType.isArray())
        {
            boolean isFinal = Modifier.isFinal(field.getModifiers());

            if (byte[].class.equals(fieldType))
            {
                if (isFinal)
                    return new FinalBytesExtractor(field);
                else
                    return new BytesExtractor(field, info.counter(field));
            }
            else if (isFinal)
            {
                return new FinalArrayExtractor(field, typeMarshal(fieldType.getComponentType()));
            }
            else
            {
                return new CountArrayExtractor(field, info.counter(field), typeMarshal(fieldType.getComponentType()));
            }
        }
        else if (String.class.equals(fieldType))
        {
            FixedLength hint = field.getAnnotation(FixedLength.class);

            if (null != hint)
                return new FixedStringExtractor(field);
            else
                return new CountStringExtractor(field, info.counter(field));
        }
        else
        {
            return new BasicExtractor(field, typeMarshal(fieldType));
        }
    }