public RpcMessage(Socket socket, ByteArrayReference buffer, out UInt32 contentOffset, out UInt32 contentOffsetLimit) : base(memberSerializers) { // // TODO: catch socket exception to prevent server from failing // buffer.EnsureCapacityCopyAllData(12); socket.ReadFullSize(buffer.array, 0, 4); // read the size Int32 rpcMessageSize = ( (0x7F000000 & (buffer.array[0] << 24)) | (0x00FF0000 & (buffer.array[1] << 16)) | (0x0000FF00 & (buffer.array[2] << 8)) | (0x000000FF & (buffer.array[3]))); if ((buffer.array[0] & 0x80) != 0x80) { throw new NotImplementedException(String.Format("Records with multiple fragments it not currently implemented")); } buffer.EnsureCapacityCopyAllData((UInt32)rpcMessageSize); socket.ReadFullSize(buffer.array, 0, rpcMessageSize); // // Deserialize // contentOffsetLimit = (UInt32)rpcMessageSize; if (RpcPerformanceLog.rpcMessageSerializationLogger != null) { RpcPerformanceLog.StartSerialize(); } contentOffset = Deserialize(buffer.array, 0, (UInt32)rpcMessageSize); if (RpcPerformanceLog.rpcMessageSerializationLogger != null) { RpcPerformanceLog.StopSerializationAndLog("RpcDeserializationTime"); } }