>백엔드 개발 >C++ >쓰기 방법을 수정하지 않고 System.Text.Json 사용자 지정 변환기에서 기본 직렬화를 달성하려면 어떻게 해야 합니까?

쓰기 방법을 수정하지 않고 System.Text.Json 사용자 지정 변환기에서 기본 직렬화를 달성하려면 어떻게 해야 합니까?

Barbara Streisand
Barbara Streisand원래의
2025-01-10 09:31:40141검색

How Can I Achieve Default Serialization in System.Text.Json Custom Converters Without Modifying the Write Method?

사용자 정의 변환기를 사용하여 기본 직렬화 처리

사용자 정의 System.Text.Json.JsonConverter를 생성할 때 사용자 정의 직렬화가 필요하지 않으므로 Write() 메서드를 항상 수정할 필요는 없습니다. 이 문서에서는 Write() 메서드에서 사용자 지정 동작을 사용하지 않도록 기본 직렬화를 자동으로 생성하는 방법을 설명합니다.

배경

JsonConverter는 우선순위에 따라 속성, 개체 또는 유형에 적용됩니다. 다음과 같은 상황이 존재합니다:

  • 속성에 적용된 사용자 정의 변환기
  • Converters 컬렉션에 추가된 변환기
  • 사용자 정의 값 유형 또는 POCO에 적용되는 변환기
  • JsonConverterFactories에서 반환된 변환기

상황마다 다르게 처리됩니다.

기본 직렬화 방법

  1. 속성에 적용되는 변환기:
  • JsonSerializer.Serialize(writer, person, options)를 호출하면 기본 직렬화를 생성할 수 있습니다.
  1. Converter 컬렉션에 추가된 변환기:
  • 사용자 정의 변환기를 제거한 JsonConverterOptions의 복사본을 만듭니다.
  • 수정된 복사본을 JsonSerializer.Serialize(Utf8JsonWriter, T, JsonSerializerOptions)에 전달합니다.
  • 이 접근 방식은 재귀 유형에 어려움을 초래할 수 있습니다.
  1. 사용자 정의 값 유형 또는 POCO에 적용되는 변환기:
  • 기본 직렬화를 직접 생성할 수 있는 방법은 없습니다.

편리한 맞춤형 팩토리 및 확장 기능

프로세스를 단순화하기 위해 Write() 메서드를 수정하지 않고도 사용자 정의 직렬화를 처리할 수 있는 사용자 정의 가능한 팩토리를 생성할 수 있습니다.

<code>public class DefaultConverterFactory<T> : JsonConverterFactory
{
    // 此处为内部 DefaultConverter 实现
}</code>

이 팩토리는 JsonSerializerOptions 복사본 생성을 관리하는 사용자 정의 변환기의 기반 역할을 합니다(사용자 정의 변환기는 제거됨). Write() 메서드의 기본 직렬화에 대한 옵션이 수정되었습니다.

<code>public class PersonConverter : DefaultConverterFactory<Person>
{
    // 此处为 Read 和 Write 方法实现
}</code>

DefaultConverterFactory 기본 클래스를 사용하면 Write() 메서드가 Read() 메서드의 사용자 지정 동작을 계속 유지하면서 기본 직렬화를 수행하도록 할 수 있습니다.

기타 참고사항

  • DefaultConverterFactory를 사용자 정의 값 유형이나 POCO에 직접 적용하면 스택 오버플로가 발생합니다.
  • 공장에서 반환된 변환기에 이 방법을 구현하려고 할 때 전체 공장을 비활성화할지 아니면 특정 유형에 대해서만 비활성화할지 결정하는 것이 중요합니다.

위 내용은 쓰기 방법을 수정하지 않고 System.Text.Json 사용자 지정 변환기에서 기본 직렬화를 달성하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.