@Override
    public void read(DataReader in) throws IOException {
        // load type tree
        if (version > 13) {
            typeTree = new TypeTreeV3(TypeV2.class);
        } else if (version > 6) {
            typeTree = new TypeTreeV2(TypeV1.class);
        } else {
            typeTree = new TypeTreeV1(TypeV1.class);
        }

        typeTreeBlock.markBegin(in);
        in.readStruct(typeTree);
        typeTreeBlock.markEnd(in);
        L.log(Level.FINER, "typeTreeBlock: {0}", typeTreeBlock);

        // load object info table
        if (version > 14) {
            objectInfoTable = new ObjectInfoTableV2(ObjectInfoV3.class);
        } else if (version > 13) {
            objectInfoTable = new ObjectInfoTableV2(ObjectInfoV2.class);
        } else {
            objectInfoTable = new ObjectInfoTableV1(ObjectInfoV1.class);
        }

        objectInfoBlock.markBegin(in);
        in.readStruct(objectInfoTable);
        objectInfoBlock.markEnd(in);
        L.log(Level.FINER, "objectInfoBlock: {0}", objectInfoBlock);

        // load object identifiers (Unity 5+ only)
        objectIDTable = new ObjectIdentifierTable();
        if (version > 10) {
            objectIDBlock.markBegin(in);
            in.readStruct(objectIDTable);
            objectIDBlock.markEnd(in);
            L.log(Level.FINER, "objectIDBlock: {0}", objectIDBlock);
        }

        // load external references
        if (version > 5) {
            externals = new FileIdentifierTable(FileIdentifierV2.class);
        } else {
            externals = new FileIdentifierTable(FileIdentifierV1.class);
        }

        externalsBlock.markBegin(in);
        in.readStruct(externals);
        externalsBlock.markEnd(in);
        L.log(Level.FINER, "externalsBlock: {0}", externalsBlock);
    }
@author Nico Bergemann <barracuda415 at yahoo.de>
disunity-core/src/main/java/info/ata4/junity/serialize/SerializedFileMetadata.java