다음을 통해 공유


새 JsonSerializer 소스 생성기 오버로드

System.Text.Json 소스 생성기 기능은 JsonSerializer 또는 JsonTypeInfo<T>를 통해 미리 생성된 형식 정보를 허용하는 새로운 오버로드를 JsonSerializerContext에 추가했습니다. 이러한 오버로드는 인스턴스를 사용하고 JsonSerializerOptions 런타임 리플렉션을 수행하는 기존 오버로드에 비해 성능을 최적화합니다. 이러한 매개 변수 형식은 모두 null를 전달할 수 있는 참조 형식입니다. 다음 예제에서는 두 방법 모두에 대한 메서드 서명 패턴을 보여 줍니다.

기존 리플렉션/JsonSerializerOptions기반 오버로드:

public static string JsonSerializer.Serialize<T>(T value, JsonSerializerOptions? options = null);
public static string JsonSerializer.Serialize(object value, Type type, JsonSerializerOptions? options = null);
public static T JsonSerializer.Deserialize<T>(string json, JsonSerializerOptions? options = null);
public static T JsonSerializer.Deserialize(string json, Type type, JsonSerializerOptions? options = null);

새 원본 생성기/JsonTypeInfo/JsonSerializerContext기반 오버로드:

public static string JsonSerializer.Serialize<T>(T value, JsonTypeInfo<T> jsonTypeInfo);
public static string JsonSerializer.Serialize(object value, Type type, JsonSerializerContext jsonSerializerContext);
public static T JsonSerializer.Deserialize<T>(string json, JsonTypeInfo<T> jsonTypeInfo);
public static object JsonSerializer.Deserialize(string json, Type type, JsonSerializerContext jsonSerializerContext);

이전 동작

null을(를) JsonSerializerOptions 매개 변수의 값으로 전달하는 코드를 작성할 수 있으며, 이는 컴파일되고 성공적으로 실행되었습니다.

entity.Property(e => e.Value).HasConversion(v => JsonSerializer.Serialize(v,null), v => JsonSerializer.Deserialize(v, null));

새 동작

.NET 6의 새로운 소스 생성기 메서드는 null 매개 변수로 JsonSerializerOptions를 전달할 경우 컴파일러의 모호성을 유발할 수 있습니다. 예를 들어 다음과 같은 오류 메시지가 표시될 수 있습니다.

호출은 'JsonSerializer.Serialize(TValue, JsonSerializerOptions?)' 메서드 또는 속성 간에 모호합니다. 및 'JsonSerializer.Serialize(TValue, JsonTypeInfo)

도입된 버전

.NET 6

파괴적 변경 유형

이 변경 사항은 소스 호환성에 영향을 줄 수 있습니다.

변경 이유

성능 최적화를 위해 새 오버로드가 serializer에 추가되었습니다. 자세한 내용은 새 System.Text.Json 원본 생성기 시도를 참조하세요.

의도한 대상에 대한 명시적 캐스트를 수행하는 등 의도한 오버로드를 명확하게 구분하는 방식으로 코드를 업데이트합니다. 예를 들어 다음과 같이 이전 동작 섹션에서 예제를 변경할 수 있습니다.

entity.Property(e => e.Value).HasConversion(v => JsonSerializer.Serialize(v, (JsonSerializerOptions)null), v => JsonSerializer.Deserialize(v, (JsonSerializerOptions)null));

다른 해결 방법은 다음과 같습니다.

  • 선택적 매개 변수 JsonSerializerOptions? options = null를 생략합니다.
  • 명명된 인수 사용.

그러나 선택적 매개 변수를 생략하거나 람다 식에서 명명된 인수를 사용할 수는 없습니다.

영향을 받는 API

모든 System.Text.Json.JsonSerializer 메서드.