in serialization/src/main/java/com/twitter/serial/util/SerializationUtils.java [273:351]
private static void readStream(@NotNull SerializerInput input, boolean singleObject) throws IOException {
int objectNesting = 0;
byte type;
if (singleObject) {
if (readNullIndicator(input)) {
return;
}
type = input.peekType();
if (type != SerializerDefs.TYPE_START_OBJECT && type != SerializerDefs.TYPE_START_OBJECT_DEBUG) {
throw new SerializationException(
"Method skipObject can only be used to skip Objects in deserialization," +
" expected start object header but found " + SerializerDefs.getTypeName(type));
}
}
while ((type = input.peekType()) != SerializerDefs.TYPE_EOF) {
switch (type) {
case SerializerDefs.TYPE_BYTE: {
input.readByte();
break;
}
case SerializerDefs.TYPE_INT: {
input.readInt();
break;
}
case SerializerDefs.TYPE_LONG: {
input.readLong();
break;
}
case SerializerDefs.TYPE_FLOAT: {
input.readFloat();
break;
}
case SerializerDefs.TYPE_DOUBLE: {
input.readDouble();
break;
}
case SerializerDefs.TYPE_BOOLEAN: {
input.readBoolean();
break;
}
case SerializerDefs.TYPE_NULL: {
input.readNull();
break;
}
case SerializerDefs.TYPE_STRING_ASCII:
case SerializerDefs.TYPE_STRING_UTF8: {
input.readString();
break;
}
case SerializerDefs.TYPE_BYTE_ARRAY: {
input.readByteArray();
break;
}
case SerializerDefs.TYPE_START_OBJECT:
case SerializerDefs.TYPE_START_OBJECT_DEBUG: {
input.readObjectStart();
++objectNesting;
break;
}
case SerializerDefs.TYPE_END_OBJECT: {
--objectNesting;
input.readObjectEnd();
if (singleObject && objectNesting == 0) {
return;
}
if (objectNesting < 0) {
throw new SerializationException("Object end with no matching object start.");
}
break;
}
default: {
throw new SerializationException("Unknown type: " + SerializerDefs.getTypeName(type) + '.');
}
}
}
if (objectNesting > 0) {
throw new SerializationException("Object start with no matching object end.");
}
}