Skip to content

Commit f175036

Browse files
[Json] JsonSerializer+PipeReader support (#116947)
1 parent a6a3475 commit f175036

35 files changed

+1392
-153
lines changed

src/libraries/System.Text.Json/ref/System.Text.Json.cs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -256,13 +256,26 @@ public static partial class JsonSerializer
256256
[System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("JSON serialization and deserialization might require types that cannot be statically analyzed. Use the overload that takes a JsonTypeInfo or JsonSerializerContext, or make sure all of the required types are preserved.")]
257257
public static object? Deserialize(ref System.Text.Json.Utf8JsonReader reader, System.Type returnType, System.Text.Json.JsonSerializerOptions? options = null) { throw null; }
258258
public static object? Deserialize(ref System.Text.Json.Utf8JsonReader reader, System.Type returnType, System.Text.Json.Serialization.JsonSerializerContext context) { throw null; }
259+
public static System.Threading.Tasks.ValueTask<object?> DeserializeAsync(System.IO.Pipelines.PipeReader utf8Json, System.Text.Json.Serialization.Metadata.JsonTypeInfo jsonTypeInfo, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) { throw null; }
260+
[System.Diagnostics.CodeAnalysis.RequiresDynamicCodeAttribute("JSON serialization and deserialization might require types that cannot be statically analyzed and might need runtime code generation. Use System.Text.Json source generation for native AOT applications.")]
261+
[System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("JSON serialization and deserialization might require types that cannot be statically analyzed. Use the overload that takes a JsonTypeInfo or JsonSerializerContext, or make sure all of the required types are preserved.")]
262+
public static System.Threading.Tasks.ValueTask<object?> DeserializeAsync(System.IO.Pipelines.PipeReader utf8Json, System.Type returnType, System.Text.Json.JsonSerializerOptions? options = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) { throw null; }
263+
public static System.Threading.Tasks.ValueTask<object?> DeserializeAsync(System.IO.Pipelines.PipeReader utf8Json, System.Type returnType, System.Text.Json.Serialization.JsonSerializerContext context, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) { throw null; }
259264
public static System.Threading.Tasks.ValueTask<object?> DeserializeAsync(System.IO.Stream utf8Json, System.Text.Json.Serialization.Metadata.JsonTypeInfo jsonTypeInfo, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) { throw null; }
260265
[System.Diagnostics.CodeAnalysis.RequiresDynamicCodeAttribute("JSON serialization and deserialization might require types that cannot be statically analyzed and might need runtime code generation. Use System.Text.Json source generation for native AOT applications.")]
261266
[System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("JSON serialization and deserialization might require types that cannot be statically analyzed. Use the overload that takes a JsonTypeInfo or JsonSerializerContext, or make sure all of the required types are preserved.")]
262267
public static System.Threading.Tasks.ValueTask<object?> DeserializeAsync(System.IO.Stream utf8Json, System.Type returnType, System.Text.Json.JsonSerializerOptions? options = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) { throw null; }
263268
public static System.Threading.Tasks.ValueTask<object?> DeserializeAsync(System.IO.Stream utf8Json, System.Type returnType, System.Text.Json.Serialization.JsonSerializerContext context, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) { throw null; }
264269
[System.Diagnostics.CodeAnalysis.RequiresDynamicCodeAttribute("JSON serialization and deserialization might require types that cannot be statically analyzed and might need runtime code generation. Use System.Text.Json source generation for native AOT applications.")]
265270
[System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("JSON serialization and deserialization might require types that cannot be statically analyzed. Use the overload that takes a JsonTypeInfo or JsonSerializerContext, or make sure all of the required types are preserved.")]
271+
public static System.Collections.Generic.IAsyncEnumerable<TValue?> DeserializeAsyncEnumerable<TValue>(System.IO.Pipelines.PipeReader utf8Json, bool topLevelValues, System.Text.Json.JsonSerializerOptions? options = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) { throw null; }
272+
[System.Diagnostics.CodeAnalysis.RequiresDynamicCodeAttribute("JSON serialization and deserialization might require types that cannot be statically analyzed and might need runtime code generation. Use System.Text.Json source generation for native AOT applications.")]
273+
[System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("JSON serialization and deserialization might require types that cannot be statically analyzed. Use the overload that takes a JsonTypeInfo or JsonSerializerContext, or make sure all of the required types are preserved.")]
274+
public static System.Collections.Generic.IAsyncEnumerable<TValue?> DeserializeAsyncEnumerable<TValue>(System.IO.Pipelines.PipeReader utf8Json, System.Text.Json.JsonSerializerOptions? options = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) { throw null; }
275+
public static System.Collections.Generic.IAsyncEnumerable<TValue?> DeserializeAsyncEnumerable<TValue>(System.IO.Pipelines.PipeReader utf8Json, System.Text.Json.Serialization.Metadata.JsonTypeInfo<TValue> jsonTypeInfo, bool topLevelValues, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) { throw null; }
276+
public static System.Collections.Generic.IAsyncEnumerable<TValue?> DeserializeAsyncEnumerable<TValue>(System.IO.Pipelines.PipeReader utf8Json, System.Text.Json.Serialization.Metadata.JsonTypeInfo<TValue> jsonTypeInfo, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) { throw null; }
277+
[System.Diagnostics.CodeAnalysis.RequiresDynamicCodeAttribute("JSON serialization and deserialization might require types that cannot be statically analyzed and might need runtime code generation. Use System.Text.Json source generation for native AOT applications.")]
278+
[System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("JSON serialization and deserialization might require types that cannot be statically analyzed. Use the overload that takes a JsonTypeInfo or JsonSerializerContext, or make sure all of the required types are preserved.")]
266279
public static System.Collections.Generic.IAsyncEnumerable<TValue?> DeserializeAsyncEnumerable<TValue>(System.IO.Stream utf8Json, bool topLevelValues, System.Text.Json.JsonSerializerOptions? options = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) { throw null; }
267280
[System.Diagnostics.CodeAnalysis.RequiresDynamicCodeAttribute("JSON serialization and deserialization might require types that cannot be statically analyzed and might need runtime code generation. Use System.Text.Json source generation for native AOT applications.")]
268281
[System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("JSON serialization and deserialization might require types that cannot be statically analyzed. Use the overload that takes a JsonTypeInfo or JsonSerializerContext, or make sure all of the required types are preserved.")]
@@ -271,6 +284,10 @@ public static partial class JsonSerializer
271284
public static System.Collections.Generic.IAsyncEnumerable<TValue?> DeserializeAsyncEnumerable<TValue>(System.IO.Stream utf8Json, System.Text.Json.Serialization.Metadata.JsonTypeInfo<TValue> jsonTypeInfo, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) { throw null; }
272285
[System.Diagnostics.CodeAnalysis.RequiresDynamicCodeAttribute("JSON serialization and deserialization might require types that cannot be statically analyzed and might need runtime code generation. Use System.Text.Json source generation for native AOT applications.")]
273286
[System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("JSON serialization and deserialization might require types that cannot be statically analyzed. Use the overload that takes a JsonTypeInfo or JsonSerializerContext, or make sure all of the required types are preserved.")]
287+
public static System.Threading.Tasks.ValueTask<TValue?> DeserializeAsync<TValue>(System.IO.Pipelines.PipeReader utf8Json, System.Text.Json.JsonSerializerOptions? options = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) { throw null; }
288+
public static System.Threading.Tasks.ValueTask<TValue?> DeserializeAsync<TValue>(System.IO.Pipelines.PipeReader utf8Json, System.Text.Json.Serialization.Metadata.JsonTypeInfo<TValue> jsonTypeInfo, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) { throw null; }
289+
[System.Diagnostics.CodeAnalysis.RequiresDynamicCodeAttribute("JSON serialization and deserialization might require types that cannot be statically analyzed and might need runtime code generation. Use System.Text.Json source generation for native AOT applications.")]
290+
[System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("JSON serialization and deserialization might require types that cannot be statically analyzed. Use the overload that takes a JsonTypeInfo or JsonSerializerContext, or make sure all of the required types are preserved.")]
274291
public static System.Threading.Tasks.ValueTask<TValue?> DeserializeAsync<TValue>(System.IO.Stream utf8Json, System.Text.Json.JsonSerializerOptions? options = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) { throw null; }
275292
public static System.Threading.Tasks.ValueTask<TValue?> DeserializeAsync<TValue>(System.IO.Stream utf8Json, System.Text.Json.Serialization.Metadata.JsonTypeInfo<TValue> jsonTypeInfo, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) { throw null; }
276293
[System.Diagnostics.CodeAnalysis.RequiresDynamicCodeAttribute("JSON serialization and deserialization might require types that cannot be statically analyzed and might need runtime code generation. Use System.Text.Json source generation for native AOT applications.")]

src/libraries/System.Text.Json/src/Resources/Strings.resx

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -830,10 +830,13 @@
830830
<data name="DuplicatePropertiesNotAllowed_JsonPropertyInfo" xml:space="preserve">
831831
<value>Duplicate property '{0}' encountered during deserialization of type '{1}'.</value>
832832
</data>
833-
<data name="DuplicatePropertiesNotAllowed_NameSpan" xml:space="preserve">
833+
<data name="DuplicatePropertiesNotAllowed_NameSpan" xml:space="preserve">
834834
<value>Duplicate property '{0}' encountered during deserialization.</value>
835835
</data>
836836
<data name="DuplicatePropertiesNotAllowed" xml:space="preserve">
837837
<value>Duplicate properties not allowed during deserialization.</value>
838838
</data>
839-
</root>
839+
<data name="PipeReaderCanceled" xml:space="preserve">
840+
<value>PipeReader.ReadAsync was canceled.</value>
841+
</data>
842+
</root>

src/libraries/System.Text.Json/src/System.Text.Json.csproj

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,10 +137,12 @@ The System.Text.Json library is built-in as part of the shared framework in .NET
137137
<Compile Include="System\Text\Json\Serialization\IJsonOnDeserializing.cs" />
138138
<Compile Include="System\Text\Json\Serialization\IJsonOnSerialized.cs" />
139139
<Compile Include="System\Text\Json\Serialization\IJsonOnSerializing.cs" />
140+
<Compile Include="System\Text\Json\Serialization\IReadBufferState.cs" />
140141
<Compile Include="System\Text\Json\Serialization\JsonNumberEnumConverter.cs" />
141142
<Compile Include="System\Text\Json\Serialization\JsonSerializer.Read.Document.cs" />
142143
<Compile Include="System\Text\Json\Serialization\JsonSerializer.Read.Element.cs" />
143144
<Compile Include="System\Text\Json\Serialization\JsonSerializer.Read.Node.cs" />
145+
<Compile Include="System\Text\Json\Serialization\JsonSerializer.Read.Pipe.cs" />
144146
<Compile Include="System\Text\Json\Serialization\JsonSerializer.Write.Document.cs" />
145147
<Compile Include="System\Text\Json\Serialization\JsonSerializer.Write.Element.cs" />
146148
<Compile Include="System\Text\Json\Serialization\JsonSerializer.Write.Node.cs" />
@@ -159,6 +161,7 @@ The System.Text.Json library is built-in as part of the shared framework in .NET
159161
<Compile Include="System\Text\Json\Serialization\Metadata\JsonTypeInfoResolverChain.cs" />
160162
<Compile Include="System\Text\Json\Serialization\Metadata\JsonTypeInfoResolverWithAddedModifiers.cs" />
161163
<Compile Include="System\Text\Json\Serialization\Metadata\PropertyRefCacheBuilder.cs" />
164+
<Compile Include="System\Text\Json\Serialization\PipeReadBufferState.cs" />
162165
<Compile Include="System\Text\Json\Serialization\PolymorphicSerializationState.cs" />
163166
<Compile Include="System\Text\Json\StackHelper.cs" />
164167
<Compile Include="System\Text\Json\ValueQueue.cs" />
@@ -294,7 +297,7 @@ The System.Text.Json library is built-in as part of the shared framework in .NET
294297
<Compile Include="System\Text\Json\Serialization\MetadataPropertyName.cs" />
295298
<Compile Include="System\Text\Json\Serialization\PreserveReferenceHandler.cs" />
296299
<Compile Include="System\Text\Json\Serialization\PreserveReferenceResolver.cs" />
297-
<Compile Include="System\Text\Json\Serialization\ReadBufferState.cs" />
300+
<Compile Include="System\Text\Json\Serialization\StreamReadBufferState.cs" />
298301
<Compile Include="System\Text\Json\Serialization\ReadStack.cs" />
299302
<Compile Include="System\Text\Json\Serialization\ReadStackFrame.cs" />
300303
<Compile Include="System\Text\Json\Serialization\ReferenceHandler.cs" />
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
// Licensed to the .NET Foundation under one or more agreements.
2+
// The .NET Foundation licenses this file to you under the MIT license.
3+
4+
using System.Buffers;
5+
using System.Threading;
6+
using System.Threading.Tasks;
7+
8+
namespace System.Text.Json.Serialization
9+
{
10+
internal interface IReadBufferState<TReadBufferState, TStream> : IDisposable
11+
where TReadBufferState : struct, IReadBufferState<TReadBufferState, TStream>
12+
{
13+
public abstract bool IsFinalBlock { get; }
14+
15+
public abstract ReadOnlySequence<byte> Bytes { get; }
16+
17+
public abstract ValueTask<TReadBufferState> ReadAsync(
18+
TStream utf8Json,
19+
CancellationToken cancellationToken,
20+
bool fillBuffer = true);
21+
22+
public abstract void Read(TStream utf8Json);
23+
24+
public abstract void Advance(long bytesConsumed);
25+
}
26+
}

src/libraries/System.Text.Json/src/System/Text/Json/Serialization/JsonSerializer.Helpers.cs

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
// Licensed to the .NET Foundation under one or more agreements.
22
// The .NET Foundation licenses this file to you under the MIT license.
33

4+
using System.Collections.Generic;
45
using System.Diagnostics;
56
using System.Diagnostics.CodeAnalysis;
67
using System.Text.Json.Serialization;
8+
using System.Text.Json.Serialization.Converters;
79
using System.Text.Json.Serialization.Metadata;
810

911
namespace System.Text.Json
@@ -139,5 +141,42 @@ static void ThrowUnableToCastValue(object? value)
139141

140142
return (T?)value;
141143
}
144+
145+
private static JsonTypeInfo<List<T?>> GetOrAddListTypeInfoForRootLevelValueMode<T>(JsonTypeInfo<T> elementTypeInfo)
146+
{
147+
if (elementTypeInfo._asyncEnumerableRootLevelValueTypeInfo != null)
148+
{
149+
return (JsonTypeInfo<List<T?>>)elementTypeInfo._asyncEnumerableRootLevelValueTypeInfo;
150+
}
151+
152+
var converter = new RootLevelListConverter<T>(elementTypeInfo);
153+
var listTypeInfo = new JsonTypeInfo<List<T?>>(converter, elementTypeInfo.Options)
154+
{
155+
ElementTypeInfo = elementTypeInfo,
156+
};
157+
158+
listTypeInfo.EnsureConfigured();
159+
elementTypeInfo._asyncEnumerableRootLevelValueTypeInfo = listTypeInfo;
160+
return listTypeInfo;
161+
}
162+
163+
private static JsonTypeInfo<List<T?>> GetOrAddListTypeInfoForArrayMode<T>(JsonTypeInfo<T> elementTypeInfo)
164+
{
165+
if (elementTypeInfo._asyncEnumerableArrayTypeInfo != null)
166+
{
167+
return (JsonTypeInfo<List<T?>>)elementTypeInfo._asyncEnumerableArrayTypeInfo;
168+
}
169+
170+
var converter = new ListOfTConverter<List<T>, T>();
171+
var listTypeInfo = new JsonTypeInfo<List<T?>>(converter, elementTypeInfo.Options)
172+
{
173+
CreateObject = static () => new List<T?>(),
174+
ElementTypeInfo = elementTypeInfo,
175+
};
176+
177+
listTypeInfo.EnsureConfigured();
178+
elementTypeInfo._asyncEnumerableArrayTypeInfo = listTypeInfo;
179+
return listTypeInfo;
180+
}
142181
}
143182
}

0 commit comments

Comments
 (0)