Skip to content

Commit

Permalink
Remove DynamicallyAccessedMembers on JsonSerializer
Browse files Browse the repository at this point in the history
  • Loading branch information
eerhardt committed May 25, 2021
1 parent be0a12d commit ed2c3a9
Show file tree
Hide file tree
Showing 37 changed files with 49 additions and 867 deletions.
44 changes: 22 additions & 22 deletions src/libraries/System.Text.Json/ref/System.Text.Json.cs

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,6 @@ namespace System.Text.Json
{
internal static partial class JsonHelpers
{
// Members accessed by the serializer when deserializing.
public const DynamicallyAccessedMemberTypes MembersAccessedOnRead =
DynamicallyAccessedMemberTypes.PublicConstructors |
DynamicallyAccessedMemberTypes.PublicProperties |
DynamicallyAccessedMemberTypes.PublicFields;

/// <summary>
/// Returns the span for the given reader.
/// </summary>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,7 @@ internal JsonArray (JsonElement element, JsonNodeOptions? options = null) : base
/// The object to be added to the end of the <see cref="JsonArray"/>.
/// </param>
[RequiresUnreferencedCode(JsonSerializer.SerializationUnreferencedCodeMessage)]
public void Add<[DynamicallyAccessedMembers(JsonHelpers.MembersAccessedOnRead)]T>(T? value)
public void Add<T>(T? value)
{
if (value == null)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ private protected JsonValue(JsonNodeOptions? options = null) : base(options) { }
/// <param name="options">Options to control the behavior.</param>
/// <returns>The new instance of the <see cref="JsonValue"/> class that contains the specified value.</returns>
[RequiresUnreferencedCode(JsonSerializer.SerializationUnreferencedCodeMessage)]
public static JsonValue? Create<[DynamicallyAccessedMembers(JsonHelpers.MembersAccessedOnRead)]T>(T? value, JsonNodeOptions? options = null)
public static JsonValue? Create<T>(T? value, JsonNodeOptions? options = null)
{
if (value == null)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,6 @@ public JsonValueNotTrimmable(TValue value, JsonNodeOptions? options = null) : ba

[UnconditionalSuppressMessage("ReflectionAnalysis", "IL2026:RequiresUnreferencedCode",
Justification = "The methods used to create this JsonValue are marked RequiresUnreferencedCode.")]
[UnconditionalSuppressMessage("ReflectionAnalysis", "IL2091:UnrecognizedReflectionPattern",
Justification = "The methods used to create this JsonValue are marked RequiresUnreferencedCode.")]
public override void WriteTo(Utf8JsonWriter writer, JsonSerializerOptions? options = null)
{
if (writer == null)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ public static partial class JsonSerializer
/// for <typeparamref name="TValue"/> or its serializable members.
/// </exception>
[RequiresUnreferencedCode(SerializationUnreferencedCodeMessage)]
public static TValue? Deserialize<[DynamicallyAccessedMembers(JsonHelpers.MembersAccessedOnRead)] TValue>(ReadOnlySpan<byte> utf8Json, JsonSerializerOptions? options = null)
public static TValue? Deserialize<TValue>(ReadOnlySpan<byte> utf8Json, JsonSerializerOptions? options = null)
=> ReadUsingOptions<TValue>(utf8Json, typeof(TValue), options);

/// <summary>
Expand All @@ -48,7 +48,7 @@ public static partial class JsonSerializer
/// for <paramref name="returnType"/> or its serializable members.
/// </exception>
[RequiresUnreferencedCode(SerializationUnreferencedCodeMessage)]
public static object? Deserialize(ReadOnlySpan<byte> utf8Json, [DynamicallyAccessedMembers(JsonHelpers.MembersAccessedOnRead)] Type returnType, JsonSerializerOptions? options = null)
public static object? Deserialize(ReadOnlySpan<byte> utf8Json, Type returnType, JsonSerializerOptions? options = null)
{
if (returnType == null)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ public static partial class JsonSerializer
/// for <typeparamref name="TValue"/> or its serializable members.
/// </exception>
[RequiresUnreferencedCode(SerializationUnreferencedCodeMessage)]
public static ValueTask<TValue?> DeserializeAsync<[DynamicallyAccessedMembers(JsonHelpers.MembersAccessedOnRead)] TValue>(
public static ValueTask<TValue?> DeserializeAsync<TValue>(
Stream utf8Json,
JsonSerializerOptions? options = null,
CancellationToken cancellationToken = default)
Expand Down Expand Up @@ -79,7 +79,7 @@ public static partial class JsonSerializer
[RequiresUnreferencedCode(SerializationUnreferencedCodeMessage)]
public static ValueTask<object?> DeserializeAsync(
Stream utf8Json,
[DynamicallyAccessedMembers(JsonHelpers.MembersAccessedOnRead)] Type returnType,
Type returnType,
JsonSerializerOptions? options = null,
CancellationToken cancellationToken = default)
{
Expand Down Expand Up @@ -200,7 +200,7 @@ public static partial class JsonSerializer
/// <paramref name="utf8Json"/> is <see langword="null"/>.
/// </exception>
[RequiresUnreferencedCode(SerializationUnreferencedCodeMessage)]
public static IAsyncEnumerable<TValue?> DeserializeAsyncEnumerable<[DynamicallyAccessedMembers(JsonHelpers.MembersAccessedOnRead)] TValue>(
public static IAsyncEnumerable<TValue?> DeserializeAsyncEnumerable<TValue>(
Stream utf8Json,
JsonSerializerOptions? options = null,
CancellationToken cancellationToken = default)
Expand Down Expand Up @@ -254,8 +254,6 @@ static async IAsyncEnumerable<TValue> CreateAsyncEnumerableDeserializer(

[UnconditionalSuppressMessage("ReflectionAnalysis", "IL2026:RequiresUnreferencedCode",
Justification = "Workaround for https://github.com/mono/linker/issues/1416. All usages are marked as unsafe.")]
[UnconditionalSuppressMessage("ReflectionAnalysis", "IL2091:RequiresUnreferencedCode",
Justification = "Workaround for https://github.com/mono/linker/issues/1416. All usages are marked as unsafe.")]
private static JsonTypeInfo CreateQueueJsonTypeInfo<TValue>(JsonConverter queueConverter, JsonSerializerOptions queueOptions) =>
new JsonTypeInfo(typeof(Queue<TValue>), queueConverter, typeof(Queue<TValue>), queueOptions);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ public static partial class JsonSerializer
/// UTF-8 methods since the implementation natively uses UTF-8.
/// </remarks>
[RequiresUnreferencedCode(SerializationUnreferencedCodeMessage)]
public static TValue? Deserialize<[DynamicallyAccessedMembers(JsonHelpers.MembersAccessedOnRead)] TValue>(string json, JsonSerializerOptions? options = null)
public static TValue? Deserialize<TValue>(string json, JsonSerializerOptions? options = null)
{
if (json == null)
{
Expand Down Expand Up @@ -75,7 +75,7 @@ public static partial class JsonSerializer
/// UTF-8 methods since the implementation natively uses UTF-8.
/// </remarks>
[RequiresUnreferencedCode(SerializationUnreferencedCodeMessage)]
public static TValue? Deserialize<[DynamicallyAccessedMembers(JsonHelpers.MembersAccessedOnRead)] TValue>(ReadOnlySpan<char> json, JsonSerializerOptions? options = null)
public static TValue? Deserialize<TValue>(ReadOnlySpan<char> json, JsonSerializerOptions? options = null)
{
// default/null span is treated as empty

Expand Down Expand Up @@ -110,7 +110,7 @@ public static partial class JsonSerializer
/// UTF-8 methods since the implementation natively uses UTF-8.
/// </remarks>
[RequiresUnreferencedCode(SerializationUnreferencedCodeMessage)]
public static object? Deserialize(string json, [DynamicallyAccessedMembers(JsonHelpers.MembersAccessedOnRead)] Type returnType, JsonSerializerOptions? options = null)
public static object? Deserialize(string json, Type returnType, JsonSerializerOptions? options = null)
{
if (json == null)
{
Expand Down Expand Up @@ -153,7 +153,7 @@ public static partial class JsonSerializer
/// UTF-8 methods since the implementation natively uses UTF-8.
/// </remarks>
[RequiresUnreferencedCode(SerializationUnreferencedCodeMessage)]
public static object? Deserialize(ReadOnlySpan<char> json, [DynamicallyAccessedMembers(JsonHelpers.MembersAccessedOnRead)] Type returnType, JsonSerializerOptions? options = null)
public static object? Deserialize(ReadOnlySpan<char> json, Type returnType, JsonSerializerOptions? options = null)
{
// default/null span is treated as empty

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ public static partial class JsonSerializer
/// </para>
/// </remarks>
[RequiresUnreferencedCode(SerializationUnreferencedCodeMessage)]
public static TValue? Deserialize<[DynamicallyAccessedMembers(JsonHelpers.MembersAccessedOnRead)] TValue>(ref Utf8JsonReader reader, JsonSerializerOptions? options = null)
public static TValue? Deserialize<TValue>(ref Utf8JsonReader reader, JsonSerializerOptions? options = null)
=> ReadUsingOptions<TValue>(ref reader, typeof(TValue), options);

/// <summary>
Expand Down Expand Up @@ -103,7 +103,7 @@ public static partial class JsonSerializer
/// </para>
/// </remarks>
[RequiresUnreferencedCode(SerializationUnreferencedCodeMessage)]
public static object? Deserialize(ref Utf8JsonReader reader, [DynamicallyAccessedMembers(JsonHelpers.MembersAccessedOnRead)] Type returnType, JsonSerializerOptions? options = null)
public static object? Deserialize(ref Utf8JsonReader reader, Type returnType, JsonSerializerOptions? options = null)
{
if (returnType == null)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ public static partial class JsonSerializer
/// for <typeparamref name="TValue"/> or its serializable members.
/// </exception>
[RequiresUnreferencedCode(SerializationUnreferencedCodeMessage)]
public static byte[] SerializeToUtf8Bytes<[DynamicallyAccessedMembers(MembersAccessedOnWrite)] TValue>(
public static byte[] SerializeToUtf8Bytes<TValue>(
TValue value,
JsonSerializerOptions? options = null)
{
Expand All @@ -47,7 +47,7 @@ public static partial class JsonSerializer
[RequiresUnreferencedCode(SerializationUnreferencedCodeMessage)]
public static byte[] SerializeToUtf8Bytes(
object? value,
[DynamicallyAccessedMembers(MembersAccessedOnWrite)] Type inputType,
Type inputType,
JsonSerializerOptions? options = null)
{
return WriteCoreBytes(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,6 @@ namespace System.Text.Json
{
public static partial class JsonSerializer
{
// Members accessed by the serializer when serializing.
private const DynamicallyAccessedMemberTypes MembersAccessedOnWrite = DynamicallyAccessedMemberTypes.PublicProperties | DynamicallyAccessedMemberTypes.PublicFields;

private static bool WriteCore<TValue>(
JsonConverter jsonConverter,
Utf8JsonWriter writer,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ public static partial class JsonSerializer
/// for <typeparamref name="TValue"/> or its serializable members.
/// </exception>
[RequiresUnreferencedCode(SerializationUnreferencedCodeMessage)]
public static Task SerializeAsync<[DynamicallyAccessedMembers(MembersAccessedOnWrite)] TValue>(
public static Task SerializeAsync<TValue>(
Stream utf8Json,
TValue value,
JsonSerializerOptions? options = null,
Expand Down Expand Up @@ -70,7 +70,7 @@ public static partial class JsonSerializer
public static Task SerializeAsync(
Stream utf8Json,
object? value,
[DynamicallyAccessedMembers(MembersAccessedOnWrite)] Type inputType,
Type inputType,
JsonSerializerOptions? options = null,
CancellationToken cancellationToken = default)
{
Expand Down Expand Up @@ -139,7 +139,7 @@ public static Task SerializeAsync<TValue>(Stream utf8Json, TValue value, JsonTyp
public static Task SerializeAsync(
Stream utf8Json,
object? value,
[DynamicallyAccessedMembers(MembersAccessedOnWrite)] Type inputType,
Type inputType,
JsonSerializerContext context,
CancellationToken cancellationToken = default)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ public static partial class JsonSerializer
/// and <see cref="SerializeAsync{TValue}(IO.Stream, TValue, JsonSerializerOptions?, Threading.CancellationToken)"/>.
/// </remarks>
[RequiresUnreferencedCode(SerializationUnreferencedCodeMessage)]
public static string Serialize<[DynamicallyAccessedMembers(MembersAccessedOnWrite)] TValue>(TValue value, JsonSerializerOptions? options = null)
public static string Serialize<TValue>(TValue value, JsonSerializerOptions? options = null)
{
return Write(value, GetRuntimeType(value), options);
}
Expand All @@ -50,7 +50,7 @@ public static partial class JsonSerializer
[RequiresUnreferencedCode(SerializationUnreferencedCodeMessage)]
public static string Serialize(
object? value,
[DynamicallyAccessedMembers(MembersAccessedOnWrite)] Type inputType,
Type inputType,
JsonSerializerOptions? options = null)
{
return Write(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ public static partial class JsonSerializer
/// for <typeparamref name="TValue"/> or its serializable members.
/// </exception>
[RequiresUnreferencedCode(SerializationUnreferencedCodeMessage)]
public static void Serialize<[DynamicallyAccessedMembers(MembersAccessedOnWrite)] TValue>(
public static void Serialize<TValue>(
Utf8JsonWriter writer,
TValue value,
JsonSerializerOptions? options = null)
Expand Down Expand Up @@ -52,7 +52,7 @@ public static partial class JsonSerializer
public static void Serialize(
Utf8JsonWriter writer,
object? value,
[DynamicallyAccessedMembers(MembersAccessedOnWrite)] Type inputType,
Type inputType,
JsonSerializerOptions? options = null)
{
Serialize<object?>(
Expand Down

This file was deleted.

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,17 @@
// The .NET Foundation licenses this file to you under the MIT license.

using System;
using System.Diagnostics.CodeAnalysis;
using System.Text.Json;

namespace SerializerTrimmingTest
{
/// <summary>
/// Tests that the enum converter factory is linker-safe.
/// Tests that the enum converter factory works with trimming.
/// </summary>
internal class Program
{
[DynamicDependency(DynamicallyAccessedMemberTypes.PublicProperties, typeof(ClassWithDay))]
static int Main(string[] args)
{
string json = JsonSerializer.Serialize(new ClassWithDay());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
// The .NET Foundation licenses this file to you under the MIT license.

using System;
using System.Diagnostics.CodeAnalysis;
using System.Text.Json;
using System.Text.Json.Serialization;

Expand All @@ -13,6 +14,7 @@ namespace SerializerTrimmingTest
/// </summary>
internal class Program
{
[DynamicDependency(DynamicallyAccessedMemberTypes.PublicProperties, typeof(ClassWithDay))]
static int Main(string[] args)
{
string json = JsonSerializer.Serialize(new ClassWithDay());
Expand Down
Loading

0 comments on commit ed2c3a9

Please sign in to comment.