public virtual NetworkState.NETWORK_STATE_TYPE Deserialize()
    {
        var state = NetworkState.NETWORK_STATE_TYPE.SUCCESS;

        _mouseState = _mouseState ?? new FDUObjectSync.MouseState();
        _mouseState.buttonStateList.ForEach(buttonState_ =>
        {
            buttonState_.button      = (InputButton)BufferedNetworkUtilsClient.ReadInt(ref state);
            buttonState_.position    = BufferedNetworkUtilsClient.ReadVector2(ref state);
            buttonState_.delta       = BufferedNetworkUtilsClient.ReadVector2(ref state);
            buttonState_.scrollDelta = BufferedNetworkUtilsClient.ReadVector2(ref state);
            buttonState_.buttonState = (FramePressState)BufferedNetworkUtilsClient.ReadInt(ref state);
        });

        return(state);
    }
    void SendServerMouseState(MouseState mouseData)
    {
        if (_server != null)
        {
            _mouseState = _mouseState ?? new FDUObjectSync.MouseState();

            _mouseState.buttonStateList.ForEach(buttonState_ =>
            {
                var button      = mouseData.GetButtonState((PointerEventData.InputButton)buttonState_.button);
                var buttonData  = button.eventData.buttonData;
                var buttonState = button.eventData.buttonState;

                buttonState_.position    = buttonData.position;
                buttonState_.delta       = buttonData.delta;
                buttonState_.scrollDelta = buttonData.scrollDelta;
                buttonState_.buttonState = (FramePressState)buttonState;

                // normalize
                buttonState_.position = new Vector2(
                    buttonState_.position.x / Screen.width,
                    buttonState_.position.y / Screen.height);

                buttonState_.delta = new Vector2(
                    buttonState_.delta.x / Screen.width,
                    buttonState_.delta.y / Screen.height);

                buttonState_.scrollDelta = new Vector2(
                    buttonState_.scrollDelta.x / Screen.width,
                    buttonState_.scrollDelta.y / Screen.height);
            });
            _server.SendState(_objectId, this);
            _server.FlushBuffer();
            if (ClusterHelper.Instance.UseInputEventPhase)
            {
                //Debug.Log("SendEofInputEvent");
                _server.SendEofInputEvent();
            }
        }
    }