/**
         * This method handles all outgoing and incoming data.
         * @param to TransferObject
         * @return Object
         */
        public Object execute(TransferObject to) {
		    if(to.isLongConnection()){
			    Monitor.Enter(theLock);
			    try {
				    if(longClientSession == null){
                        longClientSession = new LongClientSession(hostIp, hostPort, timeout, retryCount);
				    }
				    return longClientSession.start(to);
			    } finally {
                    Monitor.Exit(theLock);
			    }
		    }else{
			    if(shortClientSession == null){
                    shortClientSession = new ShortClientSession(hostIp, hostPort, timeout, retryCount);
			    }
			    return shortClientSession.start(to);
		    }
	    }
        public static byte[] transferObjectToByteArray(TransferObject to) {
    	    // out
		    byte[] toByteArray = to.getByteData();
		    byte[] sendData = null;
		    // if compress flag is true
            if (to.isCompress()) {
			    sendData = TransferUtil.getOutputByCompress(toByteArray);
		    } else {
			    sendData = TransferUtil.getOutputByNormal(toByteArray);
		    }

            //set long connection flag
            if (to.isLongConnection()) {
                sendData[0] |= TransferObject.LONGCONNECTION_FLAG;
            }

            //set new version flag
            if (to.isNewVersion()) {
                sendData[0] |= TransferObject.NEWVERSION_FLAG;
            }

            byte[] newData = new byte[sendData.Length + TatalaFlag.Length];
            Array.Copy(TatalaFlag, 0, newData, 0, TatalaFlag.Length);
            Array.Copy(sendData, 0, newData, TatalaFlag.Length, sendData.Length);
            sendData = newData;

		    return sendData;
        }