public boolean decode() {
		this.serverList = new ArrayList<Long>();
		this.configMap = new HashMap<String, String>();

		bucketCount = byteBuffer.getInt();
		copyCount = byteBuffer.getInt();
		this.configVersion = byteBuffer.getInt();

		// get config items
		int count = byteBuffer.getInt();
		for (int i = 0; i < count; i++) {
			String name = readString();
			String value = readString();
			configMap.put(name, value);
		}

		// get server list
		count = byteBuffer.getInt();
		if (count > 0) {
			byte[] b = new byte[count];
			byteBuffer.get(b);
			byte[] result = TairUtil.deflate(b);
			ByteBuffer buff = ByteBuffer.wrap(result);
			buff.order(ByteOrder.LITTLE_ENDIAN);

			List<Long> ss = new ArrayList<Long>();
			boolean valid = false;
			int c = 0;
			while (buff.hasRemaining()) {
				long sid = buff.getLong();
				if (!valid) {
					valid = sid != 0;
				}
				ss.add(sid);
				c++;
				if (c == bucketCount) {
					if (valid) {
						serverList.addAll(ss);
						ss = new ArrayList<Long>();
					}
					c = 0;
					valid = false;
				}
			}
		}
		
		aliveNodes = new HashSet<Long>();
		count = byteBuffer.getInt();
		for(int i=0; i<count; i++)
			aliveNodes.add(byteBuffer.getLong());

		return true;
	}