Skip to content

Commit 8e4bef2

Browse files
Use global caching in JsonSerializerOptions (#64646)
* Use caching in Reflection.Emit member accessors * Refactor JsonSerializerOptions caching & use shared caching contexts * Update src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Metadata/ReflectionEmitCachingMemberAccessor.Cache.cs * address feedback * tweak cache eviction constants * Update src/libraries/System.Text.Json/src/System/Text/Json/Serialization/JsonSerializerOptions.Caching.cs * minor refinements to cache eviction algorithm * rename JsonSerializerOptions._context to _serializerContext * ensure that the update handler clears the shared caching contexts * fix remark
1 parent 6200568 commit 8e4bef2

23 files changed

+779
-147
lines changed

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,7 @@ System.Text.Json.Nodes.JsonValue</PackageDescription>
121121
<Compile Include="System\Text\Json\Serialization\JsonSerializer.Write.Element.cs" />
122122
<Compile Include="System\Text\Json\Serialization\JsonSerializer.Write.Node.cs" />
123123
<Compile Include="System\Text\Json\Serialization\JsonSerializerContext.cs" />
124+
<Compile Include="System\Text\Json\Serialization\JsonSerializerOptions.Caching.cs" />
124125
<Compile Include="System\Text\Json\Serialization\ReferenceEqualsWrapper.cs" />
125126
<Compile Include="System\Text\Json\Serialization\ConverterStrategy.cs" />
126127
<Compile Include="System\Text\Json\Serialization\ConverterList.cs" />
@@ -247,6 +248,8 @@ System.Text.Json.Nodes.JsonValue</PackageDescription>
247248
<Compile Include="System\Text\Json\Serialization\Metadata\MemberAccessor.cs" />
248249
<Compile Include="System\Text\Json\Serialization\Metadata\ParameterRef.cs" />
249250
<Compile Include="System\Text\Json\Serialization\Metadata\PropertyRef.cs" />
251+
<Compile Include="System\Text\Json\Serialization\Metadata\ReflectionEmitCachingMemberAccessor.Cache.cs" />
252+
<Compile Include="System\Text\Json\Serialization\Metadata\ReflectionEmitCachingMemberAccessor.cs" />
250253
<Compile Include="System\Text\Json\Serialization\Metadata\ReflectionEmitMemberAccessor.cs" />
251254
<Compile Include="System\Text\Json\Serialization\Metadata\ReflectionMemberAccessor.cs" />
252255
<Compile Include="System\Text\Json\Serialization\MetadataPropertyName.cs" />

src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/JsonMetadataServicesConverter.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ internal override bool OnTryWrite(Utf8JsonWriter writer, T value, JsonSerializer
7676
if (!state.SupportContinuation &&
7777
jsonTypeInfo is JsonTypeInfo<T> info &&
7878
info.SerializeHandler != null &&
79-
info.Options._context?.CanUseSerializationLogic == true)
79+
info.Options._serializerContext?.CanUseSerializationLogic == true)
8080
{
8181
info.SerializeHandler(writer, value);
8282
return true;

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,12 @@ private static JsonTypeInfo GetTypeInfo(JsonSerializerOptions? options, Type run
1818
Debug.Assert(runtimeType != null);
1919

2020
options ??= JsonSerializerOptions.Default;
21-
if (!options.IsInitializedForReflectionSerializer)
21+
if (!JsonSerializerOptions.IsInitializedForReflectionSerializer)
2222
{
23-
options.InitializeForReflectionSerializer();
23+
JsonSerializerOptions.InitializeForReflectionSerializer();
2424
}
2525

26-
return options.GetOrAddClassForRootType(runtimeType);
26+
return options.GetOrAddJsonTypeInfoForRootType(runtimeType);
2727
}
2828

2929
private static JsonTypeInfo GetTypeInfo(JsonSerializerContext context, Type type)

src/libraries/System.Text.Json/src/System/Text/Json/Serialization/JsonSerializer.Read.Stream.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -287,9 +287,9 @@ public static partial class JsonSerializer
287287
CancellationToken cancellationToken = default)
288288
{
289289
options ??= JsonSerializerOptions.Default;
290-
if (!options.IsInitializedForReflectionSerializer)
290+
if (!JsonSerializerOptions.IsInitializedForReflectionSerializer)
291291
{
292-
options.InitializeForReflectionSerializer();
292+
JsonSerializerOptions.InitializeForReflectionSerializer();
293293
}
294294

295295
return CreateAsyncEnumerableDeserializer(utf8Json, options, cancellationToken);

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ private static void WriteUsingGeneratedSerializer<TValue>(Utf8JsonWriter writer,
4141

4242
if (jsonTypeInfo.HasSerialize &&
4343
jsonTypeInfo is JsonTypeInfo<TValue> typedInfo &&
44-
typedInfo.Options._context?.CanUseSerializationLogic == true)
44+
typedInfo.Options._serializerContext?.CanUseSerializationLogic == true)
4545
{
4646
Debug.Assert(typedInfo.SerializeHandler != null);
4747
typedInfo.SerializeHandler(writer, value);
@@ -59,8 +59,8 @@ private static void WriteUsingSerializer<TValue>(Utf8JsonWriter writer, in TValu
5959

6060
Debug.Assert(!jsonTypeInfo.HasSerialize ||
6161
jsonTypeInfo is not JsonTypeInfo<TValue> ||
62-
jsonTypeInfo.Options._context == null ||
63-
!jsonTypeInfo.Options._context.CanUseSerializationLogic,
62+
jsonTypeInfo.Options._serializerContext == null ||
63+
!jsonTypeInfo.Options._serializerContext.CanUseSerializationLogic,
6464
"Incorrect method called. WriteUsingGeneratedSerializer() should have been called instead.");
6565

6666
WriteStack state = default;

src/libraries/System.Text.Json/src/System/Text/Json/Serialization/JsonSerializerContext.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ public JsonSerializerOptions Options
3030
if (_options == null)
3131
{
3232
_options = new JsonSerializerOptions();
33-
_options._context = this;
33+
_options._serializerContext = this;
3434
}
3535

3636
return _options;
@@ -97,13 +97,13 @@ protected JsonSerializerContext(JsonSerializerOptions? options)
9797
{
9898
if (options != null)
9999
{
100-
if (options._context != null)
100+
if (options._serializerContext != null)
101101
{
102102
ThrowHelper.ThrowInvalidOperationException_JsonSerializerOptionsAlreadyBoundToContext();
103103
}
104104

105105
_options = options;
106-
options._context = this;
106+
options._serializerContext = this;
107107
}
108108
}
109109

0 commit comments

Comments
 (0)