diff --git a/Src/Newtonsoft.Json.Tests/Properties/AssemblyInfo.cs b/Src/Newtonsoft.Json.Tests/Properties/AssemblyInfo.cs index bcbdae61..aeb236f9 100644 --- a/Src/Newtonsoft.Json.Tests/Properties/AssemblyInfo.cs +++ b/Src/Newtonsoft.Json.Tests/Properties/AssemblyInfo.cs @@ -76,5 +76,5 @@ using System.Security; // by using the '*' as shown below: [assembly: AssemblyVersion("4.5.0.0")] #if !PocketPC -[assembly: AssemblyFileVersion("4.5.10.15509")] +[assembly: AssemblyFileVersion("4.5.10.15511")] #endif diff --git a/Src/Newtonsoft.Json.Tests/Serialization/TraceWriterTests.cs b/Src/Newtonsoft.Json.Tests/Serialization/TraceWriterTests.cs index f024b476..50e420cb 100644 --- a/Src/Newtonsoft.Json.Tests/Serialization/TraceWriterTests.cs +++ b/Src/Newtonsoft.Json.Tests/Serialization/TraceWriterTests.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Diagnostics; +using System.Globalization; using System.IO; using System.Runtime.Serialization; using System.Runtime.Serialization.Formatters; @@ -23,9 +24,95 @@ using System.Linq; namespace Newtonsoft.Json.Tests.Serialization { + public class Staff + { + public string Name { get; set; } + public DateTime StartDate { get; set; } + public IList Roles { get; set; } + } + [TestFixture] public class TraceWriterTests : TestFixtureBase { +#if !(SILVERLIGHT || PORTABLE || NETFX_CORE) + [Test] + public void DiagnosticsTraceWriterTest() + { + StringWriter sw = new StringWriter(); + TextWriterTraceListener listener = new TextWriterTraceListener(sw); + + try + { + Trace.AutoFlush = true; + Trace.Listeners.Add(listener); + + DiagnosticsTraceWriter traceWriter = new DiagnosticsTraceWriter(); + traceWriter.Trace(TraceLevel.Verbose, "Verbose!", null); + traceWriter.Trace(TraceLevel.Info, "Info!", null); + traceWriter.Trace(TraceLevel.Warning, "Warning!", null); + traceWriter.Trace(TraceLevel.Error, "Error!", null); + traceWriter.Trace(TraceLevel.Off, "Off!", null); + + Assert.AreEqual(@"Newtonsoft.Json Verbose: 0 : Verbose! +Newtonsoft.Json Information: 0 : Info! +Newtonsoft.Json Warning: 0 : Warning! +Newtonsoft.Json Error: 0 : Error! +", sw.ToString()); + } + finally + { + Trace.Listeners.Remove(listener); + Trace.AutoFlush = false; + } + } +#endif + + [Test] + public void MemoryTraceWriterTest() + { + Staff staff = new Staff(); + staff.Name = "Arnie Admin"; + staff.Roles = new List {"Administrator"}; + staff.StartDate = DateTime.Now; + + ITraceWriter traceWriter = new MemoryTraceWriter(); + + JsonConvert.SerializeObject( + staff, + new JsonSerializerSettings {TraceWriter = traceWriter, Converters = {new JavaScriptDateTimeConverter()}}); + + Console.WriteLine(traceWriter); + // 2012-11-11T12:08:42.761 Info Started serializing Newtonsoft.Json.Tests.Serialization.Staff. Path ''. + // 2012-11-11T12:08:42.785 Info Started serializing System.DateTime with converter Newtonsoft.Json.Converters.JavaScriptDateTimeConverter. Path 'StartDate'. + // 2012-11-11T12:08:42.791 Info Finished serializing System.DateTime with converter Newtonsoft.Json.Converters.JavaScriptDateTimeConverter. Path 'StartDate'. + // 2012-11-11T12:08:42.797 Info Started serializing System.Collections.Generic.List`1[System.String]. Path 'Roles'. + // 2012-11-11T12:08:42.798 Info Finished serializing System.Collections.Generic.List`1[System.String]. Path 'Roles'. + // 2012-11-11T12:08:42.799 Info Finished serializing Newtonsoft.Json.Tests.Serialization.Staff. Path ''. + + MemoryTraceWriter memoryTraceWriter = (MemoryTraceWriter)traceWriter; + + Assert.AreEqual(743, memoryTraceWriter.ToString().Length); + Assert.AreEqual(6, memoryTraceWriter.GetTraceMessages().Count()); + } + + [Test] + public void MemoryTraceWriterLimitTest() + { + MemoryTraceWriter traceWriter = new MemoryTraceWriter(); + + for (int i = 0; i < 1005; i++) + { + traceWriter.Trace(TraceLevel.Verbose, (i + 1).ToString(CultureInfo.InvariantCulture), null); + } + + IList traceMessages = traceWriter.GetTraceMessages().ToList(); + + Assert.AreEqual(1000, traceMessages.Count); + + Assert.IsTrue(traceMessages.First().EndsWith(" 6")); + Assert.IsTrue(traceMessages.Last().EndsWith(" 1005")); + } + [Test] public void Serialize() { diff --git a/Src/Newtonsoft.Json/Newtonsoft.Json.Net20.csproj b/Src/Newtonsoft.Json/Newtonsoft.Json.Net20.csproj index 0626850a..d60c32ee 100644 --- a/Src/Newtonsoft.Json/Newtonsoft.Json.Net20.csproj +++ b/Src/Newtonsoft.Json/Newtonsoft.Json.Net20.csproj @@ -103,8 +103,11 @@ + + + diff --git a/Src/Newtonsoft.Json/Newtonsoft.Json.Net35.csproj b/Src/Newtonsoft.Json/Newtonsoft.Json.Net35.csproj index 3fdc02bf..500953ae 100644 --- a/Src/Newtonsoft.Json/Newtonsoft.Json.Net35.csproj +++ b/Src/Newtonsoft.Json/Newtonsoft.Json.Net35.csproj @@ -116,8 +116,10 @@ + + diff --git a/Src/Newtonsoft.Json/Newtonsoft.Json.Portable.csproj b/Src/Newtonsoft.Json/Newtonsoft.Json.Portable.csproj index 4d548881..8cccf090 100644 --- a/Src/Newtonsoft.Json/Newtonsoft.Json.Portable.csproj +++ b/Src/Newtonsoft.Json/Newtonsoft.Json.Portable.csproj @@ -143,6 +143,7 @@ + @@ -169,6 +170,7 @@ + diff --git a/Src/Newtonsoft.Json/Newtonsoft.Json.Silverlight.csproj b/Src/Newtonsoft.Json/Newtonsoft.Json.Silverlight.csproj index 6846a387..483ae3fd 100644 --- a/Src/Newtonsoft.Json/Newtonsoft.Json.Silverlight.csproj +++ b/Src/Newtonsoft.Json/Newtonsoft.Json.Silverlight.csproj @@ -166,6 +166,7 @@ + @@ -191,6 +192,7 @@ + diff --git a/Src/Newtonsoft.Json/Newtonsoft.Json.WinRT.csproj b/Src/Newtonsoft.Json/Newtonsoft.Json.WinRT.csproj index 6851d875..02cc8313 100644 --- a/Src/Newtonsoft.Json/Newtonsoft.Json.WinRT.csproj +++ b/Src/Newtonsoft.Json/Newtonsoft.Json.WinRT.csproj @@ -241,6 +241,8 @@ + + diff --git a/Src/Newtonsoft.Json/Newtonsoft.Json.WindowsPhone.csproj b/Src/Newtonsoft.Json/Newtonsoft.Json.WindowsPhone.csproj index 91566f20..ef4f4a77 100644 --- a/Src/Newtonsoft.Json/Newtonsoft.Json.WindowsPhone.csproj +++ b/Src/Newtonsoft.Json/Newtonsoft.Json.WindowsPhone.csproj @@ -139,6 +139,7 @@ + @@ -164,6 +165,7 @@ + diff --git a/Src/Newtonsoft.Json/Newtonsoft.Json.csproj b/Src/Newtonsoft.Json/Newtonsoft.Json.csproj index 65f266fb..b1295ef0 100644 --- a/Src/Newtonsoft.Json/Newtonsoft.Json.csproj +++ b/Src/Newtonsoft.Json/Newtonsoft.Json.csproj @@ -113,8 +113,10 @@ + + diff --git a/Src/Newtonsoft.Json/Properties/AssemblyInfo.cs b/Src/Newtonsoft.Json/Properties/AssemblyInfo.cs index cad32025..b8960ba4 100644 --- a/Src/Newtonsoft.Json/Properties/AssemblyInfo.cs +++ b/Src/Newtonsoft.Json/Properties/AssemblyInfo.cs @@ -90,7 +90,7 @@ using System.Security; // by using the '*' as shown below: [assembly: AssemblyVersion("4.5.0.0")] #if !PocketPC -[assembly: AssemblyFileVersion("4.5.10.15509")] +[assembly: AssemblyFileVersion("4.5.10.15511")] #endif [assembly: CLSCompliant(true)] diff --git a/Src/Newtonsoft.Json/Serialization/DiagnosticsTraceWriter.cs b/Src/Newtonsoft.Json/Serialization/DiagnosticsTraceWriter.cs new file mode 100644 index 00000000..ea6fce9f --- /dev/null +++ b/Src/Newtonsoft.Json/Serialization/DiagnosticsTraceWriter.cs @@ -0,0 +1,57 @@ +#if !(SILVERLIGHT || PORTABLE || NETFX_CORE) +using System; +using System.Diagnostics; +using DiagnosticsTrace = System.Diagnostics.Trace; + +namespace Newtonsoft.Json.Serialization +{ + public class DiagnosticsTraceWriter : ITraceWriter + { + public TraceLevel LevelFilter { get; set; } + + private TraceEventType GetTraceEventType(TraceLevel level) + { + switch (level) + { + case TraceLevel.Error: + return TraceEventType.Error; + case TraceLevel.Warning: + return TraceEventType.Warning; + case TraceLevel.Info: + return TraceEventType.Information; + case TraceLevel.Verbose: + return TraceEventType.Verbose; + default: + throw new ArgumentOutOfRangeException("level"); + } + } + + public void Trace(TraceLevel level, string message, Exception ex) + { + if (level == TraceLevel.Off) + return; + + TraceEventCache eventCache = new TraceEventCache(); + TraceEventType traceEventType = GetTraceEventType(level); + + foreach (TraceListener listener in DiagnosticsTrace.Listeners) + { + if (!listener.IsThreadSafe) + { + lock (listener) + { + listener.TraceEvent(eventCache, "Newtonsoft.Json", traceEventType, 0, message); + } + } + else + { + listener.TraceEvent(eventCache, "Newtonsoft.Json", traceEventType, 0, message); + } + + if (DiagnosticsTrace.AutoFlush) + listener.Flush(); + } + } + } +} +#endif \ No newline at end of file diff --git a/Src/Newtonsoft.Json/Serialization/MemoryTraceWriter.cs b/Src/Newtonsoft.Json/Serialization/MemoryTraceWriter.cs new file mode 100644 index 00000000..768684ff --- /dev/null +++ b/Src/Newtonsoft.Json/Serialization/MemoryTraceWriter.cs @@ -0,0 +1,49 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Text; + +namespace Newtonsoft.Json.Serialization +{ + public class MemoryTraceWriter : ITraceWriter + { + private readonly Queue _traceMessages; + + public TraceLevel LevelFilter { get; set; } + + public MemoryTraceWriter() + { + LevelFilter = TraceLevel.Verbose; + _traceMessages = new Queue(); + } + + public void Trace(TraceLevel level, string message, Exception ex) + { + string traceMessage = DateTime.Now.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fff") + " " + level.ToString("g") + " " + message; + + if (_traceMessages.Count >= 1000) + _traceMessages.Dequeue(); + + _traceMessages.Enqueue(traceMessage); + } + + public IEnumerable GetTraceMessages() + { + return _traceMessages; + } + + public override string ToString() + { + StringBuilder sb = new StringBuilder(); + foreach (string traceMessage in _traceMessages) + { + if (sb.Length > 0) + sb.AppendLine(); + + sb.Append(traceMessage); + } + + return sb.ToString(); + } + } +} \ No newline at end of file