[JsonConvert] 属性を使用した JSON.Net での StackOverflowException の回避
JSON.Net でクラスのフラット化に [JsonConvert] 属性を使用すると、StackOverflowException
が発生することがあります。 これは通常、シリアル化プロセスで再帰的参照または循環参照が発生した場合に発生します。 ただし、属性を指定せずに SerializeObject
を直接使用すると、正しく機能します。
問題と解決策:
この問題は、カスタム WriteJson
の JsonConverter
メソッド内での不適切な処理が原因で発生します。 堅牢な WriteJson
メソッドは、いくつかのシリアル化の複雑さを考慮する必要があります。
これらの問題に対処する、改良された WriteJson
メソッドを次に示します。
<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; var propertyValue = property.ValueProvider.GetValue(value); writer.WritePropertyName(propertyName); 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
実装は、[JsonConvert] 属性でカスタム シリアル化を使用してクラスをフラット化するためのより包括的で信頼性の高いアプローチを提供し、StackOverflowException
エラーを効果的に防止します。
以上がクラスのフラット化に JsonConvert 属性を使用するときに StackOverflowException を回避するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。