public final static Deserializer init(final SongData sdc, final MasterThread master) {
		final Path idx = getIdx(sdc.getRoot());
		final IOHandler io = sdc.getIOHandler();
		final Map<String, AbstractInputStream> zipEntriesMap;

		if (!idx.exists())
			zipEntriesMap = null;
		else
			zipEntriesMap = io.openInZip(idx);
		final AbstractInputStream in;
		final Deserializer instance;
		if (zipEntriesMap == null) {
			in = null;
		} else if (zipEntriesMap.size() == 1) {
			in = zipEntriesMap.values().iterator().next();
		} else {
			in = zipEntriesMap.get(VERSION_ID_FILE);
		}
		try {
			final int version = in == null ? -1 : in.read();
			switch (version) {
			case 3:
				instance = new Deserializer_3(sdc) {
					private final java.util.concurrent.atomic.AtomicInteger id = new java.util.concurrent.atomic.AtomicInteger(
							-1);

					@Override
					public final Runnable getDeserialTask() {
						return null;

					}

					@Override
					protected final void deserialize_() throws IOException {
						final int id = this.id.incrementAndGet();
						if (id == 0) {
							final Deserializer sdd = new Deserializer_3(this.sdc);
							sdd.deserialize();
							sdd.abort_();
						}
					}
				};
				break;
			case 0:
				instance = new Deserializer_0(sdc, master);
				break;
			case -1: // first run
			default:
				instance = new Deserializer_0(sdc, master);
			}
			return instance;
		} catch (final IOException e) {
			return null;
		}
	}