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)); }
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); }
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())); }
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); } }