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 중국어 웹사이트의 기타 관련 기사를 참조하세요!