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();
}