T BuildResponse(SocketConnection sc) { byte[] responseBuffer = sc.GetDataBuffer(); // Timeout occured if (responseBuffer.Length == 0) { throw new ClientException("Timeout"); } // Create memorystream for deserialization purposes: // - skip the first 4 bytes (length (l) + control byte (cb)) // - read up to boundaryMarker minus 7 (= l + cb + crlf) using (var ms = new MemoryStream(responseBuffer, 1, responseBuffer.Length - 1)) using (var reader = new StreamReader(ms)) { var controlChar = responseBuffer[0]; switch (controlChar) { case WireFormat.SuccessControlChar: return(serializer.Deserialize(ms)); case WireFormat.ErrorControlChar: throw new ClientException(reader.ReadToEnd()); default: throw new ClientException("Unknown control character detected"); } } }