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