Esempio n. 1
0
        public int Serialize(Stream outStream, object message)
        {
            var msg          = message as UpdateLatestPacakge;
            var binaryWriter = MyBinaryWriter.Allocate(outStream);

            binaryWriter.Write(_version);
            if (MessagePool.GetPackageBySeq(msg.Head.LastUserCmdSeq) != null)
            {
                _logger.ErrorFormat("repetition  msg.Head.UserCmdSeq{0}", msg.Head.LastUserCmdSeq);
                binaryWriter.Write((byte)0);
                return(binaryWriter.WriterLenght);
            }

            MessagePool.AddMessage(msg);
            MessagePool.ClearOldMessage(msg.Head.LastAckUserCmdSeq);
            if (_sendHistoryStreams.Count > _sendCount)
            {
                RemoveHistoryFirst();
            }

            for (int i = 0; i < _sendCount; i++)
            {
                if (_sendHistorySeqs.Count > 0 && msg.Head.LastAckUserCmdSeq > 0 &&
                    _sendHistorySeqs.First() <= msg.Head.LastAckUserCmdSeq)
                {
                    RemoveHistoryFirst();
                }
                else
                {
                    break;
                }
            }

            var stream = SerializeSinaglePackage(msg);

            _sendHistoryStreams.AddLast(stream);
            _sendHistorySeqs.AddLast(msg.Head.LastUserCmdSeq);


            binaryWriter.Write((byte)_sendHistoryStreams.Count);

            foreach (var sendHistroyStream in _sendHistoryStreams)
            {
                binaryWriter.Write(sendHistroyStream.Stream.GetBuffer(),
                                   (int)(sendHistroyStream.Stream.Position - sendHistroyStream.Length), (int)sendHistroyStream.Length);
            }

            _logger.DebugFormat("send package{0}", binaryWriter.Position);

            var ret = binaryWriter.WriterLenght;

            binaryWriter.ReleaseReference();
            return(ret);
        }