Skip to content

Commit 95a4476

Browse files
authored
Remove DynamicallyAccessedMembers on JsonSerializer (#53235)
* Remove DynamicallyAccessedMembers on JsonSerializer Fix #52268 * Remove DynamicallyAccessedMembers from System.Net.Http.Json These are no longer required since System.Text.Json doesn't have these annotations anymore. * Update PreviousNetCoreApp baseline for attribute removal * Fix trimming tests on browser-wasm * Fix Json tests on EnableAggressiveTrimming leg
1 parent 26017ce commit 95a4476

File tree

48 files changed

+116
-951
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

48 files changed

+116
-951
lines changed

src/libraries/System.Net.Http.Json/ref/System.Net.Http.Json.cs

+20-21
Large diffs are not rendered by default.

src/libraries/System.Net.Http.Json/src/System/Net/Http/Json/HttpClientJsonExtensions.Get.cs

+10-10
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ namespace System.Net.Http.Json
1616
public static partial class HttpClientJsonExtensions
1717
{
1818
[RequiresUnreferencedCode(HttpContentJsonExtensions.SerializationUnreferencedCodeMessage)]
19-
public static Task<object?> GetFromJsonAsync(this HttpClient client, string? requestUri, [DynamicallyAccessedMembers(JsonHelpers.DeserializationMemberTypes)] Type type, JsonSerializerOptions? options, CancellationToken cancellationToken = default)
19+
public static Task<object?> GetFromJsonAsync(this HttpClient client, string? requestUri, Type type, JsonSerializerOptions? options, CancellationToken cancellationToken = default)
2020
{
2121
if (client == null)
2222
{
@@ -28,7 +28,7 @@ public static partial class HttpClientJsonExtensions
2828
}
2929

3030
[RequiresUnreferencedCode(HttpContentJsonExtensions.SerializationUnreferencedCodeMessage)]
31-
public static Task<object?> GetFromJsonAsync(this HttpClient client, Uri? requestUri, [DynamicallyAccessedMembers(JsonHelpers.DeserializationMemberTypes)] Type type, JsonSerializerOptions? options, CancellationToken cancellationToken = default)
31+
public static Task<object?> GetFromJsonAsync(this HttpClient client, Uri? requestUri, Type type, JsonSerializerOptions? options, CancellationToken cancellationToken = default)
3232
{
3333
if (client == null)
3434
{
@@ -40,7 +40,7 @@ public static partial class HttpClientJsonExtensions
4040
}
4141

4242
[RequiresUnreferencedCode(HttpContentJsonExtensions.SerializationUnreferencedCodeMessage)]
43-
public static Task<TValue?> GetFromJsonAsync<[DynamicallyAccessedMembers(JsonHelpers.DeserializationMemberTypes)] TValue>(this HttpClient client, string? requestUri, JsonSerializerOptions? options, CancellationToken cancellationToken = default)
43+
public static Task<TValue?> GetFromJsonAsync<TValue>(this HttpClient client, string? requestUri, JsonSerializerOptions? options, CancellationToken cancellationToken = default)
4444
{
4545
if (client == null)
4646
{
@@ -52,7 +52,7 @@ public static partial class HttpClientJsonExtensions
5252
}
5353

5454
[RequiresUnreferencedCode(HttpContentJsonExtensions.SerializationUnreferencedCodeMessage)]
55-
public static Task<TValue?> GetFromJsonAsync<[DynamicallyAccessedMembers(JsonHelpers.DeserializationMemberTypes)] TValue>(this HttpClient client, Uri? requestUri, JsonSerializerOptions? options, CancellationToken cancellationToken = default)
55+
public static Task<TValue?> GetFromJsonAsync<TValue>(this HttpClient client, Uri? requestUri, JsonSerializerOptions? options, CancellationToken cancellationToken = default)
5656
{
5757
if (client == null)
5858
{
@@ -108,23 +108,23 @@ public static partial class HttpClientJsonExtensions
108108
}
109109

110110
[RequiresUnreferencedCode(HttpContentJsonExtensions.SerializationUnreferencedCodeMessage)]
111-
public static Task<object?> GetFromJsonAsync(this HttpClient client, string? requestUri, [DynamicallyAccessedMembers(JsonHelpers.DeserializationMemberTypes)] Type type, CancellationToken cancellationToken = default)
111+
public static Task<object?> GetFromJsonAsync(this HttpClient client, string? requestUri, Type type, CancellationToken cancellationToken = default)
112112
=> client.GetFromJsonAsync(requestUri, type, options: null, cancellationToken);
113113

114114
[RequiresUnreferencedCode(HttpContentJsonExtensions.SerializationUnreferencedCodeMessage)]
115-
public static Task<object?> GetFromJsonAsync(this HttpClient client, Uri? requestUri, [DynamicallyAccessedMembers(JsonHelpers.DeserializationMemberTypes)] Type type, CancellationToken cancellationToken = default)
115+
public static Task<object?> GetFromJsonAsync(this HttpClient client, Uri? requestUri, Type type, CancellationToken cancellationToken = default)
116116
=> client.GetFromJsonAsync(requestUri, type, options: null, cancellationToken);
117117

118118
[RequiresUnreferencedCode(HttpContentJsonExtensions.SerializationUnreferencedCodeMessage)]
119-
public static Task<TValue?> GetFromJsonAsync<[DynamicallyAccessedMembers(JsonHelpers.DeserializationMemberTypes)] TValue>(this HttpClient client, string? requestUri, CancellationToken cancellationToken = default)
119+
public static Task<TValue?> GetFromJsonAsync<TValue>(this HttpClient client, string? requestUri, CancellationToken cancellationToken = default)
120120
=> client.GetFromJsonAsync<TValue>(requestUri, options: null, cancellationToken);
121121

122122
[RequiresUnreferencedCode(HttpContentJsonExtensions.SerializationUnreferencedCodeMessage)]
123-
public static Task<TValue?> GetFromJsonAsync<[DynamicallyAccessedMembers(JsonHelpers.DeserializationMemberTypes)] TValue>(this HttpClient client, Uri? requestUri, CancellationToken cancellationToken = default)
123+
public static Task<TValue?> GetFromJsonAsync<TValue>(this HttpClient client, Uri? requestUri, CancellationToken cancellationToken = default)
124124
=> client.GetFromJsonAsync<TValue>(requestUri, options: null, cancellationToken);
125125

126126
[RequiresUnreferencedCode(HttpContentJsonExtensions.SerializationUnreferencedCodeMessage)]
127-
private static async Task<object?> GetFromJsonAsyncCore(Task<HttpResponseMessage> taskResponse, [DynamicallyAccessedMembers(JsonHelpers.DeserializationMemberTypes)] Type type, JsonSerializerOptions? options, CancellationToken cancellationToken)
127+
private static async Task<object?> GetFromJsonAsyncCore(Task<HttpResponseMessage> taskResponse, Type type, JsonSerializerOptions? options, CancellationToken cancellationToken)
128128
{
129129
using (HttpResponseMessage response = await taskResponse.ConfigureAwait(false))
130130
{
@@ -146,7 +146,7 @@ public static partial class HttpClientJsonExtensions
146146
}
147147

148148
[RequiresUnreferencedCode(HttpContentJsonExtensions.SerializationUnreferencedCodeMessage)]
149-
private static async Task<T?> GetFromJsonAsyncCore<[DynamicallyAccessedMembers(JsonHelpers.DeserializationMemberTypes)] T>(Task<HttpResponseMessage> taskResponse, JsonSerializerOptions? options, CancellationToken cancellationToken)
149+
private static async Task<T?> GetFromJsonAsyncCore<T>(Task<HttpResponseMessage> taskResponse, JsonSerializerOptions? options, CancellationToken cancellationToken)
150150
{
151151
using (HttpResponseMessage response = await taskResponse.ConfigureAwait(false))
152152
{

src/libraries/System.Net.Http.Json/src/System/Net/Http/Json/HttpClientJsonExtensions.Post.cs

+4-4
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ namespace System.Net.Http.Json
1212
public static partial class HttpClientJsonExtensions
1313
{
1414
[RequiresUnreferencedCode(HttpContentJsonExtensions.SerializationUnreferencedCodeMessage)]
15-
public static Task<HttpResponseMessage> PostAsJsonAsync<[DynamicallyAccessedMembers(JsonHelpers.SerializationMemberTypes)] TValue>(this HttpClient client, string? requestUri, TValue value, JsonSerializerOptions? options = null, CancellationToken cancellationToken = default)
15+
public static Task<HttpResponseMessage> PostAsJsonAsync<TValue>(this HttpClient client, string? requestUri, TValue value, JsonSerializerOptions? options = null, CancellationToken cancellationToken = default)
1616
{
1717
if (client == null)
1818
{
@@ -24,7 +24,7 @@ public static partial class HttpClientJsonExtensions
2424
}
2525

2626
[RequiresUnreferencedCode(HttpContentJsonExtensions.SerializationUnreferencedCodeMessage)]
27-
public static Task<HttpResponseMessage> PostAsJsonAsync<[DynamicallyAccessedMembers(JsonHelpers.SerializationMemberTypes)] TValue>(this HttpClient client, Uri? requestUri, TValue value, JsonSerializerOptions? options = null, CancellationToken cancellationToken = default)
27+
public static Task<HttpResponseMessage> PostAsJsonAsync<TValue>(this HttpClient client, Uri? requestUri, TValue value, JsonSerializerOptions? options = null, CancellationToken cancellationToken = default)
2828
{
2929
if (client == null)
3030
{
@@ -36,11 +36,11 @@ public static partial class HttpClientJsonExtensions
3636
}
3737

3838
[RequiresUnreferencedCode(HttpContentJsonExtensions.SerializationUnreferencedCodeMessage)]
39-
public static Task<HttpResponseMessage> PostAsJsonAsync<[DynamicallyAccessedMembers(JsonHelpers.SerializationMemberTypes)] TValue>(this HttpClient client, string? requestUri, TValue value, CancellationToken cancellationToken)
39+
public static Task<HttpResponseMessage> PostAsJsonAsync<TValue>(this HttpClient client, string? requestUri, TValue value, CancellationToken cancellationToken)
4040
=> client.PostAsJsonAsync(requestUri, value, options: null, cancellationToken);
4141

4242
[RequiresUnreferencedCode(HttpContentJsonExtensions.SerializationUnreferencedCodeMessage)]
43-
public static Task<HttpResponseMessage> PostAsJsonAsync<[DynamicallyAccessedMembers(JsonHelpers.SerializationMemberTypes)] TValue>(this HttpClient client, Uri? requestUri, TValue value, CancellationToken cancellationToken)
43+
public static Task<HttpResponseMessage> PostAsJsonAsync<TValue>(this HttpClient client, Uri? requestUri, TValue value, CancellationToken cancellationToken)
4444
=> client.PostAsJsonAsync(requestUri, value, options: null, cancellationToken);
4545

4646
public static Task<HttpResponseMessage> PostAsJsonAsync<TValue>(this HttpClient client, string? requestUri, TValue value, JsonTypeInfo<TValue> jsonTypeInfo, CancellationToken cancellationToken = default)

src/libraries/System.Net.Http.Json/src/System/Net/Http/Json/HttpClientJsonExtensions.Put.cs

+4-4
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ namespace System.Net.Http.Json
1212
public static partial class HttpClientJsonExtensions
1313
{
1414
[RequiresUnreferencedCode(HttpContentJsonExtensions.SerializationUnreferencedCodeMessage)]
15-
public static Task<HttpResponseMessage> PutAsJsonAsync<[DynamicallyAccessedMembers(JsonHelpers.SerializationMemberTypes)] TValue>(this HttpClient client, string? requestUri, TValue value, JsonSerializerOptions? options = null, CancellationToken cancellationToken = default)
15+
public static Task<HttpResponseMessage> PutAsJsonAsync<TValue>(this HttpClient client, string? requestUri, TValue value, JsonSerializerOptions? options = null, CancellationToken cancellationToken = default)
1616
{
1717
if (client == null)
1818
{
@@ -24,7 +24,7 @@ public static partial class HttpClientJsonExtensions
2424
}
2525

2626
[RequiresUnreferencedCode(HttpContentJsonExtensions.SerializationUnreferencedCodeMessage)]
27-
public static Task<HttpResponseMessage> PutAsJsonAsync<[DynamicallyAccessedMembers(JsonHelpers.SerializationMemberTypes)] TValue>(this HttpClient client, Uri? requestUri, TValue value, JsonSerializerOptions? options = null, CancellationToken cancellationToken = default)
27+
public static Task<HttpResponseMessage> PutAsJsonAsync<TValue>(this HttpClient client, Uri? requestUri, TValue value, JsonSerializerOptions? options = null, CancellationToken cancellationToken = default)
2828
{
2929
if (client == null)
3030
{
@@ -36,11 +36,11 @@ public static partial class HttpClientJsonExtensions
3636
}
3737

3838
[RequiresUnreferencedCode(HttpContentJsonExtensions.SerializationUnreferencedCodeMessage)]
39-
public static Task<HttpResponseMessage> PutAsJsonAsync<[DynamicallyAccessedMembers(JsonHelpers.SerializationMemberTypes)] TValue>(this HttpClient client, string? requestUri, TValue value, CancellationToken cancellationToken)
39+
public static Task<HttpResponseMessage> PutAsJsonAsync<TValue>(this HttpClient client, string? requestUri, TValue value, CancellationToken cancellationToken)
4040
=> client.PutAsJsonAsync(requestUri, value, options: null, cancellationToken);
4141

4242
[RequiresUnreferencedCode(HttpContentJsonExtensions.SerializationUnreferencedCodeMessage)]
43-
public static Task<HttpResponseMessage> PutAsJsonAsync<[DynamicallyAccessedMembers(JsonHelpers.SerializationMemberTypes)] TValue>(this HttpClient client, Uri? requestUri, TValue value, CancellationToken cancellationToken)
43+
public static Task<HttpResponseMessage> PutAsJsonAsync<TValue>(this HttpClient client, Uri? requestUri, TValue value, CancellationToken cancellationToken)
4444
=> client.PutAsJsonAsync(requestUri, value, options: null, cancellationToken);
4545

4646
public static Task<HttpResponseMessage> PutAsJsonAsync<TValue>(this HttpClient client, string? requestUri, TValue value, JsonTypeInfo<TValue> jsonTypeInfo, CancellationToken cancellationToken = default)

src/libraries/System.Net.Http.Json/src/System/Net/Http/Json/HttpContentJsonExtensions.cs

+4-4
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ public static partial class HttpContentJsonExtensions
1717
internal const string SerializationUnreferencedCodeMessage = "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.";
1818

1919
[RequiresUnreferencedCode(SerializationUnreferencedCodeMessage)]
20-
public static Task<object?> ReadFromJsonAsync(this HttpContent content, [DynamicallyAccessedMembers(JsonHelpers.DeserializationMemberTypes)] Type type, JsonSerializerOptions? options = null, CancellationToken cancellationToken = default)
20+
public static Task<object?> ReadFromJsonAsync(this HttpContent content, Type type, JsonSerializerOptions? options = null, CancellationToken cancellationToken = default)
2121
{
2222
if (content == null)
2323
{
@@ -30,7 +30,7 @@ public static partial class HttpContentJsonExtensions
3030
}
3131

3232
[RequiresUnreferencedCode(SerializationUnreferencedCodeMessage)]
33-
public static Task<T?> ReadFromJsonAsync<[DynamicallyAccessedMembers(JsonHelpers.DeserializationMemberTypes)] T>(this HttpContent content, JsonSerializerOptions? options = null, CancellationToken cancellationToken = default)
33+
public static Task<T?> ReadFromJsonAsync<T>(this HttpContent content, JsonSerializerOptions? options = null, CancellationToken cancellationToken = default)
3434
{
3535
if (content == null)
3636
{
@@ -43,7 +43,7 @@ public static partial class HttpContentJsonExtensions
4343
}
4444

4545
[RequiresUnreferencedCode(SerializationUnreferencedCodeMessage)]
46-
private static async Task<object?> ReadFromJsonAsyncCore(HttpContent content, [DynamicallyAccessedMembers(JsonHelpers.DeserializationMemberTypes)] Type type, Encoding? sourceEncoding, JsonSerializerOptions? options, CancellationToken cancellationToken)
46+
private static async Task<object?> ReadFromJsonAsyncCore(HttpContent content, Type type, Encoding? sourceEncoding, JsonSerializerOptions? options, CancellationToken cancellationToken)
4747
{
4848
using (Stream contentStream = await GetContentStream(content, sourceEncoding, cancellationToken).ConfigureAwait(false))
4949
{
@@ -59,7 +59,7 @@ public static partial class HttpContentJsonExtensions
5959
}
6060

6161
[RequiresUnreferencedCode(SerializationUnreferencedCodeMessage)]
62-
private static async Task<T?> ReadFromJsonAsyncCore<[DynamicallyAccessedMembers(JsonHelpers.DeserializationMemberTypes)] T>(HttpContent content, Encoding? sourceEncoding, JsonSerializerOptions? options, CancellationToken cancellationToken)
62+
private static async Task<T?> ReadFromJsonAsyncCore<T>(HttpContent content, Encoding? sourceEncoding, JsonSerializerOptions? options, CancellationToken cancellationToken)
6363
{
6464
using (Stream contentStream = await GetContentStream(content, sourceEncoding, cancellationToken).ConfigureAwait(false))
6565
{

src/libraries/System.Net.Http.Json/src/System/Net/Http/Json/JsonContent.cs

+5-6
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,13 @@ namespace System.Net.Http.Json
1717
public sealed partial class JsonContent : HttpContent
1818
{
1919
private readonly JsonSerializerOptions? _jsonSerializerOptions;
20-
[DynamicallyAccessedMembers(JsonHelpers.SerializationMemberTypes)]
2120
public Type ObjectType { get; }
2221
public object? Value { get; }
2322

2423
[RequiresUnreferencedCode(HttpContentJsonExtensions.SerializationUnreferencedCodeMessage)]
2524
private JsonContent(
2625
object? inputValue,
27-
[DynamicallyAccessedMembers(JsonHelpers.SerializationMemberTypes)] Type inputType,
26+
Type inputType,
2827
MediaTypeHeaderValue? mediaType,
2928
JsonSerializerOptions? options)
3029
{
@@ -45,11 +44,11 @@ private JsonContent(
4544
}
4645

4746
[RequiresUnreferencedCode(HttpContentJsonExtensions.SerializationUnreferencedCodeMessage)]
48-
public static JsonContent Create<[DynamicallyAccessedMembers(JsonHelpers.SerializationMemberTypes)] T>(T inputValue, MediaTypeHeaderValue? mediaType = null, JsonSerializerOptions? options = null)
47+
public static JsonContent Create<T>(T inputValue, MediaTypeHeaderValue? mediaType = null, JsonSerializerOptions? options = null)
4948
=> Create(inputValue, typeof(T), mediaType, options);
5049

5150
[RequiresUnreferencedCode(HttpContentJsonExtensions.SerializationUnreferencedCodeMessage)]
52-
public static JsonContent Create(object? inputValue, [DynamicallyAccessedMembers(JsonHelpers.SerializationMemberTypes)] Type inputType, MediaTypeHeaderValue? mediaType = null, JsonSerializerOptions? options = null)
51+
public static JsonContent Create(object? inputValue, Type inputType, MediaTypeHeaderValue? mediaType = null, JsonSerializerOptions? options = null)
5352
=> new JsonContent(inputValue, inputType, mediaType, options);
5453

5554
protected override Task SerializeToStreamAsync(Stream stream, TransportContext? context)
@@ -134,13 +133,13 @@ private async Task SerializeToStreamAsyncCore(Stream targetStream, bool async, C
134133
#if NETCOREAPP
135134
[UnconditionalSuppressMessage("ReflectionAnalysis", "IL2026:RequiresUnreferencedCode",
136135
Justification = "Workaround for https://github.com/mono/linker/issues/1416. The outer method is marked as RequiresUnreferencedCode.")]
137-
static void SerializeHelper(Utf8JsonWriter writer, object? value, [DynamicallyAccessedMembers(JsonHelpers.SerializationMemberTypes)] Type inputType, JsonSerializerOptions? options)
136+
static void SerializeHelper(Utf8JsonWriter writer, object? value, Type inputType, JsonSerializerOptions? options)
138137
=> JsonSerializer.Serialize(writer, value, inputType, options);
139138
#endif
140139

141140
[UnconditionalSuppressMessage("ReflectionAnalysis", "IL2026:RequiresUnreferencedCode",
142141
Justification = "Workaround for https://github.com/mono/linker/issues/1416. The outer method is marked as RequiresUnreferencedCode.")]
143-
static Task SerializeAsyncHelper(Stream utf8Json, object? value, [DynamicallyAccessedMembers(JsonHelpers.SerializationMemberTypes)] Type inputType, JsonSerializerOptions? options, CancellationToken cancellationToken)
142+
static Task SerializeAsyncHelper(Stream utf8Json, object? value, Type inputType, JsonSerializerOptions? options, CancellationToken cancellationToken)
144143
=> JsonSerializer.SerializeAsync(utf8Json, value, inputType, options, cancellationToken);
145144
}
146145
}

src/libraries/System.Net.Http.Json/src/System/Net/Http/Json/JsonHelpers.cs

-4
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
// The .NET Foundation licenses this file to you under the MIT license.
33

44
using System.Diagnostics;
5-
using System.Diagnostics.CodeAnalysis;
65
using System.Net.Http.Headers;
76
using System.Text;
87
using System.Text.Json;
@@ -11,9 +10,6 @@ namespace System.Net.Http.Json
1110
{
1211
internal static class JsonHelpers
1312
{
14-
internal const DynamicallyAccessedMemberTypes SerializationMemberTypes = DynamicallyAccessedMemberTypes.PublicFields | DynamicallyAccessedMemberTypes.PublicProperties;
15-
internal const DynamicallyAccessedMemberTypes DeserializationMemberTypes = DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.PublicFields | DynamicallyAccessedMemberTypes.PublicProperties;
16-
1713
internal static readonly JsonSerializerOptions s_defaultSerializerOptions = new JsonSerializerOptions(JsonSerializerDefaults.Web);
1814

1915
internal static MediaTypeHeaderValue GetDefaultMediaType() => new("application/json") { CharSet = "utf-8" };

0 commit comments

Comments
 (0)