protected Object readObject() throws IOException {
		Field[] objTable = readObjectTable();
		
		
		Object[] newTable = new Object[objTable.length];
		
		Object obj;
		for (int i = 0; i < newTable.length; i++) {
			obj = createObject(objTable[i].id, objTable[i].fields);
			if (obj == null) {
				newTable[i] = objTable[i];
			} else {
				newTable[i] = obj;
			}
		}
		
		fixReferences(objTable, newTable);
		
		for (int i = newTable.length - 1; i >= 0; i--) {
			obj = newTable[i];
			if (obj instanceof ISerializable) {
				((ISerializable) obj).initFromFields(objTable[i].fields);
			}
		}
		
		for (int i = newTable.length - 1; i >= 0; i--) {
			obj = newTable[i];
			if (obj instanceof ISerializable) {
				((ISerializable) obj).init();
			}
		}
		
		return newTable[0];
	}