새 JsonSerializer 소스 생성기 오버로드

System.Text.Json 소스 생성기 기능은 JsonTypeInfo<T> 또는 JsonSerializerContext를 통해 미리 생성된 형식 정보를 허용하는 새로운 오버로드를 JsonSerializer에 추가했습니다. 이러한 오버로드는 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);

이전 동작

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

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

새 동작

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

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

도입된 버전

.NET 6

호환성이 손상되는 변경의 형식

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

변경 이유

새 오버로드가 성능 최적화로 직렬 변환기에 추가되었습니다. 자세한 내용은 새 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 메서드.