From e7324e2495b2262019d477751ba71e35a26032a5 Mon Sep 17 00:00:00 2001 From: Marco Rossignoli Date: Tue, 11 Jun 2019 06:56:58 +0200 Subject: [PATCH] [3.0 Bug fix]Fix JsonSerializer.WriteAsync (dotnet/corefx#38308) * fix serialization * create tailored test * cleanup namespace * address some feedback * add poco test * update test * simplify loop Commit migrated from https://github.com/dotnet/corefx/commit/bab7cea4e612c8d0bd13b4a52a2c91ec974f4e96 --- .../Json/Serialization/JsonSerializer.Write.cs | 12 ++++---- .../tests/Serialization/Stream.WriteTests.cs | 32 +++++++++++++++++++++- 2 files changed, 37 insertions(+), 7 deletions(-) diff --git a/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/JsonSerializer.Write.cs b/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/JsonSerializer.Write.cs index 31d5dad..5d7a5dd 100644 --- a/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/JsonSerializer.Write.cs +++ b/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/JsonSerializer.Write.cs @@ -18,7 +18,6 @@ namespace System.Text.Json JsonSerializerOptions options, ref WriteStack state) { - bool continueWriting = true; bool finishedSerializing; do { @@ -48,16 +47,17 @@ namespace System.Text.Json break; } - if (flushThreshold >= 0 && writer.BytesPending > flushThreshold) + if (finishedSerializing && writer.CurrentDepth == 0) { - return false; + break; } - if (finishedSerializing && writer.CurrentDepth == 0) + // If serialization is not yet end and we surpass beyond flush threshold return false and flush stream. + if (flushThreshold >= 0 && writer.BytesPending > flushThreshold) { - continueWriting = false; + return false; } - } while (continueWriting); + } while (true); return true; } diff --git a/src/libraries/System.Text.Json/tests/Serialization/Stream.WriteTests.cs b/src/libraries/System.Text.Json/tests/Serialization/Stream.WriteTests.cs index 62bbf85..4d277cd 100644 --- a/src/libraries/System.Text.Json/tests/Serialization/Stream.WriteTests.cs +++ b/src/libraries/System.Text.Json/tests/Serialization/Stream.WriteTests.cs @@ -3,7 +3,6 @@ // See the LICENSE file in the project root for more information. using System.IO; -using System.Threading; using System.Threading.Tasks; using Xunit; @@ -60,6 +59,37 @@ namespace System.Text.Json.Serialization.Tests } } + [Fact] + public static async Task RoundTripLargeJsonViaJsonElementAsync() + { + // Generating tailored json + int i = 0; + StringBuilder json = new StringBuilder(); + json.Append("{"); + while (true) + { + if (json.Length >= 14757) + { + break; + } + json.AppendFormat(@"""Key_{0}"":""{0}"",", i); + i++; + } + json.Remove(json.Length - 1, 1).Append("}"); + + JsonElement root = JsonSerializer.Parse(json.ToString()); + var ms = new MemoryStream(); + await JsonSerializer.WriteAsync(ms, root, root.GetType()); + } + + [Fact] + public static async Task RoundTripLargeJsonViaPocoAsync() + { + byte[] array = JsonSerializer.Parse(JsonSerializer.ToString(new byte[11056])); + var ms = new MemoryStream(); + await JsonSerializer.WriteAsync(ms, array, array.GetType()); + } + private static async Task WriteAsync(TestStream stream) { JsonSerializerOptions options = new JsonSerializerOptions -- 2.7.4