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 메서드.
.NET