public static String dumpSerializedData()

in serialization/src/main/java/com/twitter/serial/util/SerializationUtils.java [133:271]


    public static String dumpSerializedData(@NotNull SerializerInput input, int position, boolean includeValues) {
        final StringBuilder builder = new StringBuilder().append('{').append(InternalSerialUtils.lineSeparator());
        try {
            int objectNesting = 0;
            String indentation = "    ";
            boolean addPositionMarker = position >= 0;
            byte type;
            while ((type = input.peekType()) != SerializerDefs.TYPE_EOF) {
                if (type == SerializerDefs.TYPE_END_OBJECT) {
                    --objectNesting;
                    if (objectNesting < 0) {
                        throw new SerializationException("Object end with no matching object start.");
                    }
                    indentation = InternalSerialUtils.repeat("    ", objectNesting + 1);
                    input.readObjectEnd();
                    builder.append(indentation).append('}');
                } else {
                    builder.append(indentation);
                    switch (type) {
                        case SerializerDefs.TYPE_BYTE: {
                            final byte b = input.readByte();
                            if (includeValues) {
                                builder.append("Byte: ").append(b);
                            } else {
                                builder.append("Byte");
                            }
                            break;
                        }
                        case SerializerDefs.TYPE_INT: {
                            final int i = input.readInt();
                            if (includeValues) {
                                builder.append("Integer: ").append(i);
                            } else {
                                builder.append("Integer");
                            }
                            break;
                        }
                        case SerializerDefs.TYPE_LONG: {
                            final long l = input.readLong();
                            if (includeValues) {
                                builder.append("Long: ").append(l);
                            } else {
                                builder.append("Long");
                            }
                            break;
                        }
                        case SerializerDefs.TYPE_FLOAT: {
                            final float f = input.readFloat();
                            if (includeValues) {
                                builder.append("Float: ").append(f);
                            } else {
                                builder.append("Float");
                            }
                            break;
                        }
                        case SerializerDefs.TYPE_DOUBLE: {
                            final double d = input.readDouble();
                            if (includeValues) {
                                builder.append("Double: ").append(d);
                            } else {
                                builder.append("Double");
                            }
                            break;
                        }
                        case SerializerDefs.TYPE_BOOLEAN: {
                            final boolean b = input.readBoolean();
                            if (includeValues) {
                                builder.append("Boolean: ").append(b);
                            } else {
                                builder.append("Boolean");
                            }
                            break;
                        }
                        case SerializerDefs.TYPE_NULL: {
                            input.readNull();
                            builder.append("null");
                            break;
                        }
                        case SerializerDefs.TYPE_STRING_ASCII:
                        case SerializerDefs.TYPE_STRING_UTF8: {
                            final String string = input.readNotNullString();
                            if (includeValues) {
                                builder.append("String: \"")
                                        .append(string.replace(InternalSerialUtils.lineSeparator(), "\\n")).append('"');
                            } else {
                                builder.append("String (").append(string.length()).append(')');
                            }
                            break;
                        }
                        case SerializerDefs.TYPE_BYTE_ARRAY: {
                            final byte[] buffer = input.readNotNullByteArray();
                            if (includeValues) {
                                final int writeLen = buffer.length > MAX_LEN_TO_DUMP ? MAX_LEN_TO_DUMP : buffer.length;
                                builder.append("byte[]: \"")
                                        .append(InternalSerialUtils.toHex(buffer, 0, writeLen));
                                final int diff = buffer.length - writeLen;
                                if (diff > 0) {
                                    builder.append("... ").append(diff).append(" more bytes");
                                }
                                builder.append('"');
                            } else {
                                builder.append("byte[] (").append(buffer.length).append(')');
                            }
                            break;
                        }
                        case SerializerDefs.TYPE_START_OBJECT: {
                            final int version = input.readObjectStart();
                            builder.append("Object: Unknown type, v").append(version).append(" {");
                            ++objectNesting;
                            indentation = InternalSerialUtils.repeat("    ", objectNesting + 1);
                            break;
                        }
                        case SerializerDefs.TYPE_START_OBJECT_DEBUG: {
                            final DebugClassDescriptor objectInfo = input.readDebugObjectStart();
                            builder.append("Object: ").append(objectInfo.className)
                                    .append(", v").append(objectInfo.version).append(" {");
                            ++objectNesting;
                            indentation = InternalSerialUtils.repeat("    ", objectNesting + 1);
                            break;
                        }
                        default: {
                            throw new SerializationException("Unknown type: " + SerializerDefs.getTypeName(type) + '.');
                        }
                    }
                }
                if (addPositionMarker && position < input.getPosition()) {
                    builder.append(" <<<");
                    addPositionMarker = false;
                }
                builder.append(InternalSerialUtils.lineSeparator());
            }
            if (objectNesting > 0) {
                throw new SerializationException("Object start with no matching object end.");
            }
        } catch (IOException e) {
            return builder.append("ERROR: ").append(e).toString();
        }
        return builder.append('}').toString();
    }