public virtual void OnReceivedData(ITcpSocket socket, byte[] data)
        {
            GenericState state;

            if (_serverStates.ContainsKey(socket))
            {
                state = _serverStates[socket];
                state.Buffer.SetPositionEnd();
                state.Buffer.WriteBytes(data);
            }
            else
            {
                state = new GenericState(data);
                _serverStates.Add(socket, state);
            }

            List <T> generics = Deserialize(state);

            foreach (T generic in generics)
            {
                OnReceivedGeneric(socket, generic);
            }

            if (state.Position == state.Buffer.Size)
            {
                _serverStates.Remove(socket);
            }
        }
        private List <T> Deserialize(GenericState state)
        {
            List <T> generics = new List <T>();

            while (state.Position < state.Buffer.Size)
            {
                if (state.Position + HeaderSize > state.Buffer.Size)
                {
                    break;
                }

                int length;
                if (state.ReadLength)
                {
                    length = state.Length;
                }
                else
                {
                    state.Buffer.Position = state.Position;
                    length           = state.Buffer.ReadInt32();
                    state.Position  += HeaderSize;
                    state.Length     = length;
                    state.ReadLength = true;
                }

                if (state.Position + length > state.Buffer.Size)
                {
                    break;
                }

                state.Buffer.Position = state.Position;
                byte[] messageBytes = state.Buffer.ReadBytes(length);
                T      generic      = _serializer.Deserialize(messageBytes);
                generics.Add(generic);
                state.Position  += length;
                state.Length     = 0;
                state.ReadLength = false;
            }

            return(generics);
        }