public void TestSerializationToMultipleFileLogs() { var log1 = new FileLog(Path.GetTempFileName()); var log2 = new FileLog(Path.GetTempFileName()); var builder = new LoggedFileBuilder(log1); builder.Append(new ByteArray(new byte[] { 0, 1, 2, 3, 4, 5 })); var file = builder.Close(); var channelHint = log2.AddChannel(); log2.LogEvent(channelHint, new Event(1, EventType.RequestReceived, new Netool.Network.DataEventArgs { Data = file, State = null }, DateTime.Now)); log2.LogEvent(channelHint, new Event(2, EventType.RequestReceived, new Netool.Network.DataEventArgs { Data = file, State = null }, DateTime.Now)); using (var reader = log2.CreateReader()) { var e1 = reader.ReadEvent(channelHint, 1); var e2 = reader.ReadEvent(channelHint, 2); Assert.Equal(file.Length, e1.Data.Data.Length); Assert.Equal(3, e1.Data.Data.ReadByte(3)); // check that it isn't copied repeatedly Assert.True(((IEquatable <LoggedFile>)e1.Data.Data).Equals((LoggedFile)e2.Data.Data)); } log1.DeleteFile(); log2.DeleteFile(); }
private void OnSerializing(StreamingContext context) { var log = (context.Context as FileLog.SerializationContext).Log; if (!(innerStream is LoggedFile)) { var builder = new LoggedFileBuilder(log); builder.Append(innerStream); innerStream = builder.Close(); } }
/// <summary> /// Appends data to builded stream /// </summary> /// <remarks> /// With large lengthThreshold it will take a while to create the LoggedFile. /// </remarks> /// <param name="data"></param> /// <exception cref="ArgumentNullException">data</exception> public void Append(IDataStream data) { if (data == null) { throw new ArgumentNullException("data"); } if (length >= threshold) { fileBuilder.Append(data); } else if (length + data.Length >= threshold) { fileBuilder = logger.CreateFileBuilder(); fileBuilder.Append(list); fileBuilder.Append(data); list = null; } else { list.Add((IDataStream)data.Clone()); } length += data.Length; }