Beispiel #1
0
        public void TestStringSearialization()
        {
            string _rawString = "Hello World!", _deserializedString;
            var    _serializedBytes = SerializationHelper.Encode(_rawString);

            _deserializedString = SerializationHelper.Decode(_serializedBytes);
            Assert.AreEqual(_rawString, _deserializedString, string.Format("序列化和反序列化字符串失败,原字符串:{0},反序列化后字符串:{1}", _rawString, _deserializedString));
        }
Beispiel #2
0
        private static PacketBodyBase GetPacketBody(Type packetBodyType, int msgId, byte[] data)
        {
            PacketBodyBase _packetBody = null;

            try
            {
                PacketType _packetType = (PacketType)Enum.Parse(typeof(PacketType), msgId.ToString());
                if (typeof(RequestPacket).IsAssignableFrom(packetBodyType))
                {
                    switch (_packetType)
                    {
                    case PacketType.Register:
                        _packetBody = SerializationHelper.Decode <RegisterResponse>(data); break;

                    case PacketType.Login:
                        _packetBody = SerializationHelper.Decode <LoginRequest>(data); break;

                    default:
                        throw new NotSupportedPacketTypeException(string.Format("暂不支持类型为{0}的数据包", _packetType), packetBodyType);
                    }
                }
                else if (typeof(ResponsePacket).IsAssignableFrom(packetBodyType))
                {
                    switch (_packetType)
                    {
                    case PacketType.Register:
                        _packetBody = SerializationHelper.Decode <RegisterResponse>(data); break;

                    case PacketType.Login:
                        _packetBody = SerializationHelper.Decode <LoginResponse>(data); break;

                    default:
                        throw new NotSupportedPacketTypeException(string.Format("暂不支持类型为{0}的数据包", _packetType), packetBodyType);
                    }
                }
            }
            catch
            {
                throw;
            }

            return(_packetBody);
        }
Beispiel #3
0
        public void TestObjectSerialization()
        {
            var _user1 = new UserInfo
            {
                UserId   = 1001,
                UserName = "******",
            };

            var _bytes = SerializationHelper.Encode(_user1);
            var _user2 = SerializationHelper.Decode <UserInfo>(_bytes);

            var _address1 = new Address
            {
                Province = "上海",
                City     = "上海市",
                District = "闸北区",
                Street   = "永和路118号",
            };
            var _bytes2   = SerializationHelper.Encode(_address1);
            var _address2 = SerializationHelper.Decode <Address>(_bytes2);

            Assert.AreEqual(_user1.ToString(), _user2.ToString(), string.Format("序列化和反序列化失败,原对象:{0},序列化反序列化后对象:{1}", _user1.ToString(), _user2.ToString()));
            Assert.AreEqual(_address1.ToString(), _address2.ToString(), string.Format("序列化和反序列化失败,原对象:{0},序列化反序列化后对象:{1}", _address1.ToString(), _address2.ToString()));
        }
Beispiel #4
0
        private static TResult UnPack <TResult>(byte[] data) where TResult : PacketBodyBase
        {
            try
            {
                if (data == null || (data != null && data.Length == 0))
                {
                    throw new UnPackException("数据包为空");
                }

                var    _type  = typeof(TResult);
                int    _msgId = -1;
                string _md5   = "";

                //解码数据包头部
                if (_type == typeof(RequestPacket))
                {
                    if (data.Length < RequestHeader.LENGTH)
                    {
                        throw new UnPackException("请求数据包数据不全", data);
                    }

                    var _request       = data.Take(RequestHeader.LENGTH);
                    var _requestHeader = SerializationHelper.Decode <RequestHeader>(_request.ToArray());
                    if ((data.Length - RequestHeader.LENGTH) < _requestHeader.PkgSize)
                    {
                        throw new UnPackException("请求数据包包体不全");
                    }
                    data   = data.Skip(RequestHeader.LENGTH).Take(_requestHeader.PkgSize).ToArray();
                    _msgId = _requestHeader.MsgId;
                    _md5   = _requestHeader.MD5;
                }
                else if (_type == typeof(ResponsePacket))
                {
                    if (data.Length < ResponseHeader.LENGTH)
                    {
                        throw new UnPackException("响应数据包数据不全", data);
                    }

                    var _response       = data.Take(ResponseHeader.LENGTH);
                    var _responseHeader = SerializationHelper.Decode <ResponseHeader>(_response.ToArray());
                    if ((data.Length - ResponseHeader.LENGTH) < _responseHeader.PkgSize)
                    {
                        throw new UnPackException("响应数据包包体不全");
                    }
                    data   = data.Skip(ResponseHeader.LENGTH).Take(_responseHeader.PkgSize).ToArray();
                    _msgId = _responseHeader.MsgId;
                    _md5   = _responseHeader.MD5;
                }
                else
                {
                    throw new NotSupportedPacketTypeException(string.Format("暂不支持类型为{0}的数据包", _type.ToString()), _type);
                }

                //解码数据包压缩头部
                var _compress       = data.Take(CompressHeader.LENGTH);
                var _compressHeader = SerializationHelper.Decode <CompressHeader>(_compress.ToArray());
                if ((data.Length - CompressHeader.LENGTH) < _compressHeader.CompressedSize)
                {
                    throw new UnPackException("数据包压缩包体不全");
                }
                data = data.Skip(CompressHeader.LENGTH).Take(_compressHeader.CompressedSize).ToArray();
                if (_compressHeader.Compressed == 1)
                {
                    data = CompressHelper.Decompress(data);
                }

                //验证接收到的数据是否完整
                var _newMd5 = SecurityHelper.GetMD5(data);
                if (_md5 != _newMd5)
                {
                    throw new UnPackException("MD5校验失败,接收到的数据包包体不完整");
                }

                return((TResult)GetPacketBody(_type, _msgId, data));
            }
            catch (Exception ex)
            {
                ex.Source += ".PacketUtil.UnPack";
                throw new UnPackException("数据包解包出现异常", data, ex);
            }
        }