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