From 218c25c859536613258fa2fd41c4209719ad75ea Mon Sep 17 00:00:00 2001 From: Jon Hanna Date: Sat, 7 Jan 2017 07:25:46 +0000 Subject: [PATCH] Call nullable WriteValue overloads in TraceJsonWriter (#1139) Fixes #1138 --- .../Serialization/JsonSerializerTest.cs | 30 +++ .../Serialization/TraceJsonWriter.cs | 239 ++++++++++++++++++ 2 files changed, 269 insertions(+) diff --git a/Src/Newtonsoft.Json.Tests/Serialization/JsonSerializerTest.cs b/Src/Newtonsoft.Json.Tests/Serialization/JsonSerializerTest.cs index 8bdbf7bc..7655dd52 100644 --- a/Src/Newtonsoft.Json.Tests/Serialization/JsonSerializerTest.cs +++ b/Src/Newtonsoft.Json.Tests/Serialization/JsonSerializerTest.cs @@ -7311,6 +7311,36 @@ Path '', line 1, position 1."); Assert.AreEqual(new Guid("d8220a4b-75b1-4b7a-8112-b7bdae956a45"), c.Id); } + [Test] + public void SerializeNullableGuidCustomWriterOverridesNullableGuid() + { + NullableGuid ng = new NullableGuid {Id = Guid.Empty}; + NullableGuidCountingJsonTextWriter writer = new NullableGuidCountingJsonTextWriter(new StreamWriter(Stream.Null)); + JsonSerializer serializer = JsonSerializer.Create(); + serializer.Serialize(writer, ng); + Assert.AreEqual(1, writer.NullableGuidCount); + MemoryTraceWriter traceWriter = new MemoryTraceWriter(); + serializer.TraceWriter = traceWriter; + serializer.Serialize(writer, ng); + Assert.AreEqual(2, writer.NullableGuidCount); + } + + private class NullableGuidCountingJsonTextWriter : JsonTextWriter + { + public NullableGuidCountingJsonTextWriter(TextWriter textWriter) + : base(textWriter) + { + } + + public int NullableGuidCount { get; private set; } + + public override void WriteValue(Guid? value) + { + base.WriteValue(value); + ++NullableGuidCount; + } + } + [Test] public void DeserializeGuid() { diff --git a/Src/Newtonsoft.Json/Serialization/TraceJsonWriter.cs b/Src/Newtonsoft.Json/Serialization/TraceJsonWriter.cs index 07cac70e..a5c08278 100644 --- a/Src/Newtonsoft.Json/Serialization/TraceJsonWriter.cs +++ b/Src/Newtonsoft.Json/Serialization/TraceJsonWriter.cs @@ -44,6 +44,20 @@ namespace Newtonsoft.Json.Serialization base.WriteValue(value); } + public override void WriteValue(decimal? value) + { + _textWriter.WriteValue(value); + _innerWriter.WriteValue(value); + if (value.HasValue) + { + base.WriteValue(value.GetValueOrDefault()); + } + else + { + base.WriteUndefined(); + } + } + public override void WriteValue(bool value) { _textWriter.WriteValue(value); @@ -51,6 +65,20 @@ namespace Newtonsoft.Json.Serialization base.WriteValue(value); } + public override void WriteValue(bool? value) + { + _textWriter.WriteValue(value); + _innerWriter.WriteValue(value); + if (value.HasValue) + { + base.WriteValue(value.GetValueOrDefault()); + } + else + { + base.WriteUndefined(); + } + } + public override void WriteValue(byte value) { _textWriter.WriteValue(value); @@ -58,6 +86,20 @@ namespace Newtonsoft.Json.Serialization base.WriteValue(value); } + public override void WriteValue(byte? value) + { + _textWriter.WriteValue(value); + _innerWriter.WriteValue(value); + if (value.HasValue) + { + base.WriteValue(value.GetValueOrDefault()); + } + else + { + base.WriteUndefined(); + } + } + public override void WriteValue(char value) { _textWriter.WriteValue(value); @@ -65,6 +107,20 @@ namespace Newtonsoft.Json.Serialization base.WriteValue(value); } + public override void WriteValue(char? value) + { + _textWriter.WriteValue(value); + _innerWriter.WriteValue(value); + if (value.HasValue) + { + base.WriteValue(value.GetValueOrDefault()); + } + else + { + base.WriteUndefined(); + } + } + public override void WriteValue(byte[] value) { _textWriter.WriteValue(value); @@ -86,6 +142,20 @@ namespace Newtonsoft.Json.Serialization base.WriteValue(value); } + public override void WriteValue(DateTime? value) + { + _textWriter.WriteValue(value); + _innerWriter.WriteValue(value); + if (value.HasValue) + { + base.WriteValue(value.GetValueOrDefault()); + } + else + { + base.WriteUndefined(); + } + } + #if !NET20 public override void WriteValue(DateTimeOffset value) { @@ -93,6 +163,21 @@ namespace Newtonsoft.Json.Serialization _innerWriter.WriteValue(value); base.WriteValue(value); } + + public override void WriteValue(DateTimeOffset? value) + { + _textWriter.WriteValue(value); + _innerWriter.WriteValue(value); + if (value.HasValue) + { + base.WriteValue(value.GetValueOrDefault()); + } + else + { + base.WriteUndefined(); + } + } + #endif public override void WriteValue(double value) @@ -102,6 +187,20 @@ namespace Newtonsoft.Json.Serialization base.WriteValue(value); } + public override void WriteValue(double? value) + { + _textWriter.WriteValue(value); + _innerWriter.WriteValue(value); + if (value.HasValue) + { + base.WriteValue(value.GetValueOrDefault()); + } + else + { + base.WriteUndefined(); + } + } + public override void WriteUndefined() { _textWriter.WriteUndefined(); @@ -123,6 +222,20 @@ namespace Newtonsoft.Json.Serialization base.WriteValue(value); } + public override void WriteValue(float? value) + { + _textWriter.WriteValue(value); + _innerWriter.WriteValue(value); + if (value.HasValue) + { + base.WriteValue(value.GetValueOrDefault()); + } + else + { + base.WriteUndefined(); + } + } + public override void WriteValue(Guid value) { _textWriter.WriteValue(value); @@ -130,6 +243,20 @@ namespace Newtonsoft.Json.Serialization base.WriteValue(value); } + public override void WriteValue(Guid? value) + { + _textWriter.WriteValue(value); + _innerWriter.WriteValue(value); + if (value.HasValue) + { + base.WriteValue(value.GetValueOrDefault()); + } + else + { + base.WriteUndefined(); + } + } + public override void WriteValue(int value) { _textWriter.WriteValue(value); @@ -137,6 +264,20 @@ namespace Newtonsoft.Json.Serialization base.WriteValue(value); } + public override void WriteValue(int? value) + { + _textWriter.WriteValue(value); + _innerWriter.WriteValue(value); + if (value.HasValue) + { + base.WriteValue(value.GetValueOrDefault()); + } + else + { + base.WriteUndefined(); + } + } + public override void WriteValue(long value) { _textWriter.WriteValue(value); @@ -144,6 +285,20 @@ namespace Newtonsoft.Json.Serialization base.WriteValue(value); } + public override void WriteValue(long? value) + { + _textWriter.WriteValue(value); + _innerWriter.WriteValue(value); + if (value.HasValue) + { + base.WriteValue(value.GetValueOrDefault()); + } + else + { + base.WriteUndefined(); + } + } + public override void WriteValue(object value) { #if !(NET20 || NET35 || PORTABLE || PORTABLE40) || NETSTANDARD1_1 @@ -176,6 +331,20 @@ namespace Newtonsoft.Json.Serialization base.WriteValue(value); } + public override void WriteValue(sbyte? value) + { + _textWriter.WriteValue(value); + _innerWriter.WriteValue(value); + if (value.HasValue) + { + base.WriteValue(value.GetValueOrDefault()); + } + else + { + base.WriteUndefined(); + } + } + public override void WriteValue(short value) { _textWriter.WriteValue(value); @@ -183,6 +352,20 @@ namespace Newtonsoft.Json.Serialization base.WriteValue(value); } + public override void WriteValue(short? value) + { + _textWriter.WriteValue(value); + _innerWriter.WriteValue(value); + if (value.HasValue) + { + base.WriteValue(value.GetValueOrDefault()); + } + else + { + base.WriteUndefined(); + } + } + public override void WriteValue(string value) { _textWriter.WriteValue(value); @@ -197,6 +380,20 @@ namespace Newtonsoft.Json.Serialization base.WriteValue(value); } + public override void WriteValue(TimeSpan? value) + { + _textWriter.WriteValue(value); + _innerWriter.WriteValue(value); + if (value.HasValue) + { + base.WriteValue(value.GetValueOrDefault()); + } + else + { + base.WriteUndefined(); + } + } + public override void WriteValue(uint value) { _textWriter.WriteValue(value); @@ -204,6 +401,20 @@ namespace Newtonsoft.Json.Serialization base.WriteValue(value); } + public override void WriteValue(uint? value) + { + _textWriter.WriteValue(value); + _innerWriter.WriteValue(value); + if (value.HasValue) + { + base.WriteValue(value.GetValueOrDefault()); + } + else + { + base.WriteUndefined(); + } + } + public override void WriteValue(ulong value) { _textWriter.WriteValue(value); @@ -211,6 +422,20 @@ namespace Newtonsoft.Json.Serialization base.WriteValue(value); } + public override void WriteValue(ulong? value) + { + _textWriter.WriteValue(value); + _innerWriter.WriteValue(value); + if (value.HasValue) + { + base.WriteValue(value.GetValueOrDefault()); + } + else + { + base.WriteUndefined(); + } + } + public override void WriteValue(Uri value) { _textWriter.WriteValue(value); @@ -232,6 +457,20 @@ namespace Newtonsoft.Json.Serialization base.WriteValue(value); } + public override void WriteValue(ushort? value) + { + _textWriter.WriteValue(value); + _innerWriter.WriteValue(value); + if (value.HasValue) + { + base.WriteValue(value.GetValueOrDefault()); + } + else + { + base.WriteUndefined(); + } + } + public override void WriteWhitespace(string ws) { _textWriter.WriteWhitespace(ws);