@Override public Object read(ByteBuffer buff) { int tag = buff.get(); int typeId; if (tag <= TYPE_SERIALIZED_OBJECT) { typeId = tag; } else { switch (tag) { case TAG_BOOLEAN_TRUE: typeId = TYPE_BOOLEAN; break; case TAG_INTEGER_NEGATIVE: case TAG_INTEGER_FIXED: typeId = TYPE_INT; break; case TAG_LONG_NEGATIVE: case TAG_LONG_FIXED: typeId = TYPE_LONG; break; case TAG_BIG_INTEGER_0: case TAG_BIG_INTEGER_1: case TAG_BIG_INTEGER_SMALL: typeId = TYPE_BIG_INTEGER; break; case TAG_FLOAT_0: case TAG_FLOAT_1: case TAG_FLOAT_FIXED: typeId = TYPE_FLOAT; break; case TAG_DOUBLE_0: case TAG_DOUBLE_1: case TAG_DOUBLE_FIXED: typeId = TYPE_DOUBLE; break; case TAG_BIG_DECIMAL_0: case TAG_BIG_DECIMAL_1: case TAG_BIG_DECIMAL_SMALL: case TAG_BIG_DECIMAL_SMALL_SCALED: typeId = TYPE_BIG_DECIMAL; break; default: if (tag >= TAG_INTEGER_0_15 && tag <= TAG_INTEGER_0_15 + 15) { typeId = TYPE_INT; } else if (tag >= TAG_STRING_0_15 && tag <= TAG_STRING_0_15 + 15) { typeId = TYPE_STRING; } else if (tag >= TAG_LONG_0_7 && tag <= TAG_LONG_0_7 + 7) { typeId = TYPE_LONG; } else if (tag >= TAG_BYTE_ARRAY_0_15 && tag <= TAG_BYTE_ARRAY_0_15 + 15) { typeId = TYPE_ARRAY; } else { throw DataUtils.newIllegalStateException( DataUtils.ERROR_FILE_CORRUPT, "Unknown tag {0}", tag); } } } if (typeId != last.typeId) { last = newType(typeId); } return last.read(buff, tag); }