다음을 통해 공유


System.Text.Json (JSON)으로 마이그레이션

System.Text.Json 라이브러리는 기본적으로 문자 그대로의 결정론적 행동을 강조하지 않으며, 호출자를 대신하여 추측하거나 해석하는 것을 금지합니다. 이 라이브러리는 보안과 성능을 위해 의도적으로 이렇게 설계되었습니다. System.Text.Json는 매우 구성 가능하며, 그 기능을 사용하여 직렬화된 형식에 필요한 변경을 최소화할 수 있지만, 기존 형식을 가능한 한 적은 변경으로 처리하는 것과 형식을 리팩터링하여 관용적이고 안전한 직렬화를 가능하게 하는 것 사이의 장단점을 고려하는 것이 중요합니다.

BinaryFormatter 에서 System.Text.Json로 마이그레이션할 때는 다음과 같은 동작 및 옵션을 적어 두는 것이 중요합니다.

  • 기본적으로 필드는 직렬화되거나 역직렬화되지 않지만 serialization대해 주석을 수 있습니다. JsonSerializerOptions.IncludeFields 또는 직렬화되는 형식에 대한 모든 공용 필드를 포함하도록 true 신중하게 설정할 수 있습니다.

    JsonSerializerOptions options = new()
    {
        IncludeFields = true
    };
    
  • 기본적으로 System.Text.Json은 프라이빗 필드와 속성을 무시합니다. 이 [JsonInclude] 특성을 사용하여 속성에서 public이 아닌 접근자를 사용하도록 설정할 수 있습니다. 프라이빗 필드를 포함하려면 몇 가지 사소한 추가 작업이 필요합니다.

  • System.Text.Json 는 읽기 전용 필드 또는 속성을 역직렬화할 수 없지만 [JsonConstructor] , 지정된 생성자를 사용하여 역직렬화 시 형식의 인스턴스를 만들어야 함을 나타내는 데 특성을 사용할 수 있습니다. 생성자는 읽기 전용 필드와 속성을 설정할 수 있습니다.

  • 특정 형식의 기본 serialization 동작을 재정의하기 위해서는 사용자 지정 변환기를작성할 수 있습니다.

  • 많은 컬렉션의 직렬화 및 역직렬화를 지원하지만 제한 사항이 있습니다. serialization 및 deserialization에 대해 어떤 형식 및 컬렉션이 지원되는지에 대한 더 자세한 정보는 지원되는 형식 설명서를 참조하세요.

  • 특정 조건 하에서는 사용자 지정 제네릭 컬렉션의 직렬화 및 역직렬화를 지원합니다.

  • 기본 제공 지원이 없는 다른 형식은 다음과 같습니다: DataSet, DataTable, DBNull, TimeZoneInfo, Type, ValueTuple. 그러나 이러한 형식을 지원하는 사용자 지정 변환기를 작성할 수 있습니다.

  • 형식이 [JsonDerivedType] 특성 또는 사용자 지정 변환기를 통해 명시적으로 옵트인된 다형 형식 계층 구조 직렬화 및 역직렬화 지원합니다. 개방형 상속 계층은 지원되지 않으며 다형성으로 왕복하려면 알려진 모든 파생 형식에 대한 형식 판별자 식별자가 필요합니다.

  • 속성에 [JsonIgnore] 특성이 있을 경우 serialization 시 JSON에서 해당 속성이 생략됩니다.

  • System.Text.Json에서 참조를 보존하고 순환 참조를 처리하려면 JsonSerializerOptions.ReferenceHandlerReferenceHandler.Preserve로 설정합니다.

  • Serialization 는 사용자 지정 계약으로 광범위하게 사용자 지정할 수 있으며, 직렬화된 형식에 대한 변경 내용을 최소화하면서 많은 시나리오의 차단을 해제할 수 있습니다.