개체 형식에 대한 다형 serialization

기본 구성을 사용하여 System.Text.Jsonobjectusing polymorphism 형식의 값을 직렬화합니다. 이 동작은 object에 대한 사용자 지정 변환기를 등록하는 경우 일관성이 떨어집니다. System.Text.Json은 이전에는 루트 수준 개체 값에 대해 다형성을 하드 코딩했지만 중첩된 개체 값에 대해서는 그렇지 않았습니다. .NET 7부터 사용자 지정 변환기에서 다형성을 사용하지 않도록 이 동작이 변경되었습니다.

이전 동작

다음 사용자 지정 개체 변환기를 고려해보세요.

public class CustomObjectConverter : JsonConverter<object>
{
    public override void Write(Utf8JsonWriter writer, object value, JsonSerializerOptions options)
        => writer.WriteNumberValue(42);

    public override object Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
        => throw new NotImplementedException();
}

이전 버전에서는 다음 코드가 0으로 직렬화했습니다. 직렬 변환기가 다형성을 사용하고 사용자 지정 변환기를 무시했기 때문입니다.

var options = new JsonSerializerOptions { Converters = { new CustomObjectConverter() } };
JsonSerializer.Serialize<object>(0, options);

그러나 다음 코드에서는 직렬 변환기가 사용자 지정 변환기를 적용했기 때문에 42로 직렬화했습니다.

var options = new JsonSerializerOptions { Converters = { new CustomObjectConverter() } };
JsonSerializer.Serialize<object[]>(new object[] { 0 }, options);

새 동작

.NET 7부터 이전 동작 섹션에 정의된 사용자 지정 개체 변환기를 사용하여 다음 코드는 42로 직렬화합니다. 직렬 변환기는 항상 사용자 지정 변환기를 참조하고 다형성을 사용하지 않기 때문입니다.

var options = new JsonSerializerOptions { Converters = { new CustomObjectConverter() } };
JsonSerializer.Serialize<object>(0, options);

도입된 버전

.NET 7

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

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

변경 이유

이 변경은 루트 수준 값으로 직렬화되는지 또는 중첩된 값으로 직렬화되는지에 따라, 형식에 대한 일관되지 않은 serialization 계약으로 인해 수행되었습니다.

원할 경우 형식화되지 않은 serialization 메서드 중 하나를 호출하여 루트 수준 값에 대한 다형성을 다시 가져올 수 있습니다.

var options = new JsonSerializerOptions { Converters = { new CustomObjectConverter() } };
JsonSerializer.Serialize(0, inputType: typeof(int), options); // Serializes as 0.

영향을 받는 API