/// <summary> /// 反序列化消息包。 /// </summary> /// <param name="packetHeader">消息包头。</param> /// <param name="source">要反序列化的来源流。</param> /// <param name="customErrorData">用户自定义错误数据。</param> /// <returns>反序列化后的消息包。</returns> public Packet DeserializePacket(IPacketHeader packetHeader, Stream source, out object customErrorData) { customErrorData = null; CTM_SCPacketHeader header = packetHeader as CTM_SCPacketHeader; if (header == null) { Log.Warning("Packet header is invalid."); return(null); } Packet packet = null; if (header.IsValid) { Type packetType = GetServerToClientPacketType(header.Id); if (packetType != null && source is MemoryStream) { packet = (Packet)ProtobufHelper.FromStream(ReferencePool.Acquire(packetType), (MemoryStream)source); } else { Log.Warning("Can not deserialize packet for packet id '{0}'.", header.Id.ToString()); } } else { Log.Warning("Packet header is invalid."); } ReferencePool.Release(header); return(packet); }
/// <summary> /// 反序列消息包头。 /// </summary> /// <param name="source">要反序列化的来源流。</param> /// <param name="customErrorData">用户自定义错误数据。</param> /// <returns></returns> public IPacketHeader DeserializePacketHeader(Stream source, out object customErrorData) { // 注意:此函数并不在主线程调用! customErrorData = null; CTM_SCPacketHeader scHeader = ReferencePool.Acquire <CTM_SCPacketHeader>(); MemoryStream memoryStream = source as MemoryStream; if (memoryStream != null) { ushort packetSize = BitConverter.ToUInt16(memoryStream.GetBuffer(), 0); ushort msgType = BitConverter.ToUInt16(memoryStream.GetBuffer(), PacketDefine.MsgTypeIndex); byte hasNext = memoryStream.GetBuffer()[PacketDefine.HasNextIndex]; scHeader.PacketLength = packetSize - PacketDefine.MessageIdentifyLength; scHeader.Id = msgType; scHeader.HasNext = hasNext; return(scHeader); } return(null); }