Share via


System.Text.Json의 리플렉션과 소스 생성

이 문서에서는 System.Text.Json Serialization과 관련하여 리플렉션과 소스 생성 간의 차이점을 설명합니다. 시나리오에 가장 적합한 접근 방식을 선택하는 방법에 대한 지침도 제공합니다.

메타데이터 수집

형식을 직렬화하거나 역직렬화하려면 JsonSerializer에 형식의 멤버에 액세스하는 방법에 대한 정보가 필요합니다. JsonSerializer에는 다음 정보가 필요합니다.

  • serialization을 위해 속성 getter 및 필드에 액세스하는 방법
  • deserialization을 위해 생성자, 속성 setter 및 필드에 액세스하는 방법
  • serialization 또는 deserialization을 사용자 지정하는 데 사용된 특성에 대한 정보
  • JsonSerializerOptions의 런타임 구성.

이 정보를 ‘메타데이터’라고 합니다.

반영

기본적으로 JsonSerializer리플렉션을 사용하여 런타임에 메타데이터를 수집합니다. JsonSerializer는 처음으로 형식을 직렬화하거나 역직렬화해야 할 때마다 이 메타데이터를 수집하고 캐시합니다. 메타데이터 수집 프로세스는 시간이 걸리고 메모리를 사용합니다.

원본 생성

또는 System.Text.Json은 C# 원본 생성 기능을 사용하여 성능을 개선하고, 프라이빗 메모리 사용량을 줄이며, 어셈블리 트리밍을 용이하게 하여 앱 크기를 줄일 수 있습니다. 또한 특정 리플렉션 API는 네이티브 AOT 애플리케이션에서 사용할 수 없으므로 해당 앱에 대한 소스 생성을 사용해야 합니다.

소스 생성은 다음 두 가지 모드로 사용할 수 있습니다.

  • 메타데이터 기반 모드

    컴파일 하는 동안 System.Text.Json은 Serialization에 필요한 정보를 수집하고 요청된 형식에 대한 JSON 계약 메타데이터를 채우는 소스 코드 파일을 생성합니다.

  • Serialization 최적화(빠른 경로) 모드

    이름 지정 정책 및 참조 보존과 같은 Serialization의 출력을 사용자 지정하는 JsonSerializer 기능은 성능 오버헤드를 발생시킵니다. Serialization 최적화 모드에서 System.Text.Json은 Utf8JsonWriter를 직접 사용하는 최적화된 Serialization 코드를 생성합니다. 이 최적화되거나 또는 빠른 경로 코드는 Serialization 처리량을 증가시킵니다.

    빠른 경로 Dserialization은 현재 사용할 수 없습니다. 자세한 내용은 dotnet/런타임 문제 55043을 참조하세요.

System.Text.Json의 소스를 생성하려면 C# 9.0 이상 버전이 필요합니다.

기능 비교

각 모드에서 제공하는 다음과 같은 이점에 따라 리플렉션 또는 소스 생성 모드를 선택합니다.

이점 반사 원본 생성
(메타데이터 기반 모드)
원본 생성
(Serialization 최적화 모드)
더 간단하게 코딩할 수 있습니다. ✔️
더 간단하게 디버그할 수 있습니다. ✔️ ✔️
Public이 아닌 멤버를 지원합니다. ✔️ ✔️* ✔️*
사용 가능한 모든 serialization 사용자 지정을 지원합니다. ✔️
시작 시간을 줄입니다. ✔️ ✔️
프라이빗 메모리 사용량을 줄입니다. ✔️ ✔️
런타임 리플렉션을 제거합니다. ✔️ ✔️
트리밍 안전 앱 크기를 편리하게 줄일 수 있습니다. ✔️ ✔️
serialization 처리량을 늘립니다. ✔️

* 소스 생성기는 일부 Public이 아닌 멤버(예: 동일한 어셈블리의 내부 형식)를 지원합니다. † 소스 생성 계약은 계약 사용자 지정 API를 사용하여 수정할 수 있습니다.

이점 반사 원본 생성
(메타데이터 기반 모드)
원본 생성
(Serialization 최적화 모드)
더 간단하게 코딩할 수 있습니다. ✔️
더 간단하게 디버그할 수 있습니다. ✔️
public이 아닌 접근자를 지원합니다. ✔️
필수 속성을 지원합니다. ✔️
init 전용 속성을 지원합니다. ✔️
시작 시간을 줄입니다. ✔️ ✔️
프라이빗 메모리 사용량을 줄입니다. ✔️ ✔️
런타임 리플렉션을 제거합니다. ✔️ ✔️
트리밍 안전 앱 크기를 편리하게 줄일 수 있습니다. ✔️ ✔️
serialization 처리량을 늘립니다. ✔️