private void decodeDisplayableMultiArray(boolean quoted, StringBuilder sb, CoderContext context, Class<?> prototype) {
        int start = _next;
        int type = nextType(CLASS_MULTI_ARRAY, CLASS_REREF);
        if (type == CLASS_REREF) {
            _next = start;
            Object array = get(null, null);
            if (array == null || array instanceof DisplayMarker || array.getClass().isArray()) {
                appendDisplayable(sb, array, quoted, true);
            } else {
                throw new ConversionException("Referenced object is not an array");
            }
        } else {
            try {
                _depth++;
                int componentClassHandle = nextType();
                checkSize(1);
                int dimensions = _bytes[_next++] & 0xFF;
                if (prototype == null) {
                    prototype = Array.newInstance(classForHandle(componentClassHandle), new int[dimensions]).getClass();
                }
                int length = decodeElementCount();

                _serializedItemCount++;
                registerEncodedObject(sb.length());
                sb.append('[');
                Class<?> componentType = prototype.getComponentType();
                if (componentType.getComponentType().isArray()) {
                    for (int index = 0; index < length; index++) {
                        if (index > 0)
                            sb.append(',');
                        decodeDisplayableMultiArray(quoted, sb, context, componentType);
                    }
                } else {
                    for (int index = 0; index < length; index++) {
                        if (index > 0)
                            sb.append(',');
                        decodeDisplayable(quoted, sb, context);
                    }
                }
                sb.append(']');
            } finally {
                _depth--;
            }
            closeVariableLengthItem();
        }
    }