public MessageBase Deserialize(string payload)
        {
            var         bytes   = payload.HexToByteArray();
            var         wrapper = ProtoMessageWrapper.Parser.ParseFrom(bytes);
            MessageBase message = null;

            switch (wrapper.MsgCase)
            {
            case ProtoMessageWrapper.MsgOneofCase.SessionRequestMessage:
            {
                message = SessionRequestMessageMapper.MapFromProto(wrapper.SessionRequestMessage);

                break;
            }

            case ProtoMessageWrapper.MsgOneofCase.SessionReplyMessage:
            {
                message = SessionReplyMessageMapper.MapFromProto(wrapper.SessionReplyMessage);

                break;
            }

            case ProtoMessageWrapper.MsgOneofCase.TransferRequestMessage:
            {
                message = TransferRequestMessageMapper.MapFromProto(wrapper.TransferRequestMessage);

                break;
            }

            case ProtoMessageWrapper.MsgOneofCase.TransferReplyMessage:
            {
                message = TransferReplyMessageMapper.MapFromProto(wrapper.TransferReplyMessage);

                break;
            }

            case ProtoMessageWrapper.MsgOneofCase.TransferDispatchMessage:
            {
                message = TransferDispatchMessageMapper.MapFromProto(wrapper.TransferDispatchMessage);

                break;
            }

            case ProtoMessageWrapper.MsgOneofCase.TransaferConfirmationMessage:
            {
                message = TransferConfirmationMessageMapper.MapFromProto(wrapper.TransaferConfirmationMessage);

                break;
            }

            case ProtoMessageWrapper.MsgOneofCase.TerminationMessage:
            {
                message = TerminationMessageMapper.MapFromProto(wrapper.TerminationMessage);

                break;
            }

            default:

                //TODO: Probably log it
                break;
            }

            return(message);
        }
        public string GetPayload(MessageBase messageBase)
        {
            var wrapper = new ProtoMessageWrapper();

            switch (messageBase.MessageType)
            {
            case MessageType.SessionRequest:
            {
                var proto = SessionRequestMessageMapper.MapToProto((SessionRequestMessage)messageBase);
                wrapper.SessionRequestMessage = proto;

                break;
            }

            case MessageType.SessionReply:
            {
                var proto = SessionReplyMessageMapper.MapToProto((SessionReplyMessage)messageBase);
                wrapper.SessionReplyMessage = proto;

                break;
            }

            case MessageType.TransferRequest:
            {
                var proto = TransferRequestMessageMapper.MapToProto((TransferRequestMessage)messageBase);
                wrapper.TransferRequestMessage = proto;

                break;
            }

            case MessageType.TransferReply:
            {
                var proto = TransferReplyMessageMapper.MapToProto((TransferReplyMessage)messageBase);
                wrapper.TransferReplyMessage = proto;

                break;
            }

            case MessageType.TransferDispatch:
            {
                var proto = TransferDispatchMessageMapper.MapToProto((TransferDispatchMessage)messageBase);
                wrapper.TransferDispatchMessage = proto;

                break;
            }

            case MessageType.TransferConfirmation:
            {
                var proto = TransferConfirmationMessageMapper.MapToProto((TransferConfirmationMessage)messageBase);
                wrapper.TransaferConfirmationMessage = proto;

                break;
            }

            case MessageType.Termination:
            {
                var proto = TerminationMessageMapper.MapToProto((TerminationMessage)messageBase);
                wrapper.TerminationMessage = proto;

                break;
            }

            default:
                throw new ArgumentException($"Message of type {messageBase.GetType()} contains enum message type {messageBase.MessageType}" +
                                            $"which is not supported");
            }

            var payload = wrapper.ToByteArray().ToHex(prefix: true);

            return(payload);
        }