public boolean decode() {
        this.configVersion = byteBuffer.getInt();
        resultCode = byteBuffer.getInt();

        int    count   = byteBuffer.getInt();
        int    size    = 0;
        Object key     = null;
        Object value   = null;

        this.entryList = new ArrayList<DataEntry>(count);

		for (int i = 0; i < count; i++) {
			DataEntry de = new DataEntry();

			removeMetas();
			de.decodeMeta(byteBuffer);

			size = byteBuffer.getInt();

			if (size > 0) {
				key = transcoder.decode(byteBuffer.array(), byteBuffer
						.position(), size);
				byteBuffer.position(byteBuffer.position() + size);
			}
			de.setKey(key);

			removeMetas();
			new DataEntry().decodeMeta(byteBuffer); // we don't need these
			// data
			size = byteBuffer.getInt();

			if (size > 0) {
				try {
				value = transcoder.decode(byteBuffer.array(), byteBuffer
						.position(), size);
				} catch (Throwable e) {
					resultCode = ResultCode.SERIALIZEERROR.getCode();
				}
				byteBuffer.position(byteBuffer.position() + size);
			}
			de.setValue(value);

			this.entryList.add(de);
		}
		
		if (count > 1) {
			
			int pc = byteBuffer.getInt();
			if (pc > 0) {
				proxiedKeyList = new ArrayList<DataEntry>(pc);
				for (int i=0; i<pc; i++) {
					removeMetas();
					DataEntry de = new DataEntry();
					de.decodeMeta(byteBuffer);
					size = byteBuffer.getInt();
					if (size > 0)
						proxiedKeyList.indexOf(transcoder.decode(byteBuffer.array(), byteBuffer
						.position(), size));
					byteBuffer.position(byteBuffer.position() + size);
				}
			}
		}

        return true;
    }