> 백엔드 개발 > C++ > JsonConvert 주석을 사용할 때 JSON.Net에서 StackOverflowException이 발생하는 이유는 무엇이며 어떻게 해결할 수 있습니까?

JsonConvert 주석을 사용할 때 JSON.Net에서 StackOverflowException이 발생하는 이유는 무엇이며 어떻게 해결할 수 있습니까?

Patricia Arquette
풀어 주다: 2025-01-20 15:41:09
원래의
226명이 탐색했습니다.

Why Does JSON.Net Throw a StackOverflowException When Using the JsonConvert Annotation, and How Can It Be Fixed?

JsonConvert 속성 사용 시 JSON.Net의 StackOverflowException 해결

[JsonConvert] 속성을 ​​사용하여 평면화된 클래스를 직렬화하면 JSON.Net에서 StackOverflowException이 발생할 수 있습니다. 이 문제는 SerializeObject을 직접 사용할 때와는 달리 재귀 호출에서 비롯됩니다.

해결책: 재귀 직렬화 방지

이 문제는 사용자 정의 변환기와 JsonConvert의 상호 작용에서 발생합니다. 사용자 정의 변환기(예: [JsonConverter(typeof(FJson))])가 적용되면 해당 WriteJson 메서드가 호출됩니다. 이 메소드가 JsonConvert.SerializeObject(직접 또는 간접적으로)를 호출하면 재귀 루프가 생성되어 스택 오버플로가 발생합니다.

WriteJson

코드 수정

이 재귀를 방지하려면 WriteJson에 대한 재귀 호출을 피하면서 각 속성을 개별적으로 직렬화하도록 JsonConvert.SerializeObject 메서드를 다시 작성해야 합니다. 수정된 구현은 다음과 같습니다.

<code class="language-csharp">public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
    if (value == null)
    {
        writer.WriteNull();
        return;
    }

    var contract = (JsonObjectContract)serializer.ContractResolver.ResolveContract(value.GetType());
    writer.WriteStartObject();

    foreach (var property in contract.Properties)
    {
        if (property.Ignored) continue;
        if (!ShouldSerialize(property, value)) continue;

        var propertyName = property.PropertyName;
        writer.WritePropertyName(propertyName);

        var propertyValue = property.ValueProvider.GetValue(value);

        if (property.Converter != null && property.Converter.CanWrite)
        {
            property.Converter.WriteJson(writer, propertyValue, serializer);
        }
        else
        {
            serializer.Serialize(writer, propertyValue);
        }
    }

    writer.WriteEndObject();
}

private static bool ShouldSerialize(JsonProperty property, object instance)
{
    return property.ShouldSerialize == null || property.ShouldSerialize(instance);
}</code>
로그인 후 복사

설명:

이 개정된 WriteJson 메소드는 객체의 각 속성을 반복합니다. 직렬 변환기를 사용하여 각 속성의 값을 직접 직렬화하기 전에 무시된 속성과 ShouldSerialize 메서드를 확인하여 재귀 호출을 제거하고 StackOverflowException.

문제를 해결합니다.

결론:

사용자 정의 변환기의 WriteJson 메서드 내에서 개별 속성을 직접 직렬화함으로써 재귀 순환을 중단하고 StackOverflowException을 방지하며 평면화된 클래스의 안정적인 직렬화를 보장합니다. 이 접근 방식은 JSON.Net 내에서 복잡한 객체 구조를 관리하기 위한 강력한 솔루션을 제공합니다.

위 내용은 JsonConvert 주석을 사용할 때 JSON.Net에서 StackOverflowException이 발생하는 이유는 무엇이며 어떻게 해결할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿