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