-Fixed deserializing with a TraceWriter when the reader is not at the start

This commit is contained in:
James Newton-King
2017-10-06 19:11:34 +13:00
parent 92d170a078
commit 6057d9b831
3 changed files with 105 additions and 12 deletions
@@ -33,7 +33,7 @@ using System.Threading.Tasks;
#endif
namespace Newtonsoft.Json.Tests.Serialization
{
{
public class Staff
{
public string Name { get; set; }
@@ -41,9 +41,86 @@ namespace Newtonsoft.Json.Tests.Serialization
public IList<string> Roles { get; set; }
}
public class RoleTrace
{
public string Name { get; set; }
}
[TestFixture]
public class TraceWriterTests : TestFixtureBase
{
[Test]
public void DeserializedJsonWithAlreadyReadReader()
{
string json = @"{ 'name': 'Admin' }{ 'name': 'Publisher' }";
IList<RoleTrace> roles = new List<RoleTrace>();
JsonTextReader reader = new JsonTextReader(new StringReader(json));
reader.SupportMultipleContent = true;
InMemoryTraceWriter traceWriter = new InMemoryTraceWriter();
while (true)
{
if (!reader.Read())
{
break;
}
JsonSerializer serializer = new JsonSerializer();
//the next line raise an exception
serializer.TraceWriter = traceWriter;
RoleTrace role = serializer.Deserialize<RoleTrace>(reader);
roles.Add(role);
}
Assert.AreEqual("Admin", roles[0].Name);
Assert.AreEqual("Publisher", roles[1].Name);
StringAssert.AreEqual(@"Deserialized JSON:
{
""name"": ""Admin""
}", traceWriter.TraceRecords[2].Message);
StringAssert.AreEqual(@"Deserialized JSON:
{
""name"": ""Publisher""
}", traceWriter.TraceRecords[5].Message);
}
#if !(NET20 || NET35 || NET40 || PORTABLE40 || PORTABLE) || DNXCORE50
[Test]
public async Task DeserializedJsonWithAlreadyReadReader_Async()
{
string json = @"{ 'name': 'Admin' }{ 'name': 'Publisher' }";
IList<RoleTrace> roles = new List<RoleTrace>();
JsonTextReader reader = new JsonTextReader(new StringReader(json));
reader.SupportMultipleContent = true;
InMemoryTraceWriter traceWriter = new InMemoryTraceWriter();
while (true)
{
if (!await reader.ReadAsync())
{
break;
}
JsonSerializer serializer = new JsonSerializer();
//the next line raise an exception
serializer.TraceWriter = traceWriter;
RoleTrace role = serializer.Deserialize<RoleTrace>(reader);
roles.Add(role);
}
Assert.AreEqual("Admin", roles[0].Name);
Assert.AreEqual("Publisher", roles[1].Name);
StringAssert.AreEqual(@"Deserialized JSON:
{
""name"": ""Admin""
}", traceWriter.TraceRecords[2].Message);
StringAssert.AreEqual(@"Deserialized JSON:
{
""name"": ""Publisher""
}", traceWriter.TraceRecords[5].Message);
}
#endif
#if !(PORTABLE || DNXCORE50 || PORTABLE40) || NETSTANDARD2_0
[Test]
public void DiagnosticsTraceWriterTest()
+13 -2
View File
@@ -798,7 +798,7 @@ namespace Newtonsoft.Json
SetupReader(reader, out previousCulture, out previousDateTimeZoneHandling, out previousDateParseHandling, out previousFloatParseHandling, out previousMaxDepth, out previousDateFormatString);
TraceJsonReader traceJsonReader = (TraceWriter != null && TraceWriter.LevelFilter >= TraceLevel.Verbose)
? new TraceJsonReader(reader)
? CreateTraceJsonReader(reader)
: null;
JsonSerializerInternalReader serializerReader = new JsonSerializerInternalReader(this);
@@ -872,7 +872,7 @@ namespace Newtonsoft.Json
SetupReader(reader, out previousCulture, out previousDateTimeZoneHandling, out previousDateParseHandling, out previousFloatParseHandling, out previousMaxDepth, out previousDateFormatString);
TraceJsonReader traceJsonReader = (TraceWriter != null && TraceWriter.LevelFilter >= TraceLevel.Verbose)
? new TraceJsonReader(reader)
? CreateTraceJsonReader(reader)
: null;
JsonSerializerInternalReader serializerReader = new JsonSerializerInternalReader(this);
@@ -1050,6 +1050,17 @@ namespace Newtonsoft.Json
SerializeInternal(jsonWriter, value, null);
}
private TraceJsonReader CreateTraceJsonReader(JsonReader reader)
{
TraceJsonReader traceReader = new TraceJsonReader(reader);
if (reader.TokenType != JsonToken.None)
{
traceReader.WriteCurrentToken();
}
return traceReader;
}
internal virtual void SerializeInternal(JsonWriter jsonWriter, object value, Type objectType)
{
ValidationUtils.ArgumentNotNull(jsonWriter, nameof(jsonWriter));
@@ -32,56 +32,56 @@ namespace Newtonsoft.Json.Serialization
public override bool Read()
{
bool value = _innerReader.Read();
_textWriter.WriteToken(_innerReader, false, false, true);
WriteCurrentToken();
return value;
}
public override int? ReadAsInt32()
{
int? value = _innerReader.ReadAsInt32();
_textWriter.WriteToken(_innerReader, false, false, true);
WriteCurrentToken();
return value;
}
public override string ReadAsString()
{
string value = _innerReader.ReadAsString();
_textWriter.WriteToken(_innerReader, false, false, true);
WriteCurrentToken();
return value;
}
public override byte[] ReadAsBytes()
{
byte[] value = _innerReader.ReadAsBytes();
_textWriter.WriteToken(_innerReader, false, false, true);
WriteCurrentToken();
return value;
}
public override decimal? ReadAsDecimal()
{
decimal? value = _innerReader.ReadAsDecimal();
_textWriter.WriteToken(_innerReader, false, false, true);
WriteCurrentToken();
return value;
}
public override double? ReadAsDouble()
{
double? value = _innerReader.ReadAsDouble();
_textWriter.WriteToken(_innerReader, false, false, true);
WriteCurrentToken();
return value;
}
public override bool? ReadAsBoolean()
{
bool? value = _innerReader.ReadAsBoolean();
_textWriter.WriteToken(_innerReader, false, false, true);
WriteCurrentToken();
return value;
}
public override DateTime? ReadAsDateTime()
{
DateTime? value = _innerReader.ReadAsDateTime();
_textWriter.WriteToken(_innerReader, false, false, true);
WriteCurrentToken();
return value;
}
@@ -89,11 +89,16 @@ namespace Newtonsoft.Json.Serialization
public override DateTimeOffset? ReadAsDateTimeOffset()
{
DateTimeOffset? value = _innerReader.ReadAsDateTimeOffset();
_textWriter.WriteToken(_innerReader, false, false, true);
WriteCurrentToken();
return value;
}
#endif
public void WriteCurrentToken()
{
_textWriter.WriteToken(_innerReader, false, false, true);
}
public override int Depth
{
get { return _innerReader.Depth; }