You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

非抽象基类自定义JsonConverter引发栈溢出问题求助

解决System.Text.Json非抽象基类自定义转换器递归栈溢出问题

当基类标记了[JsonConverter(typeof(MyBaseClassConverter))]时,直接调用JsonSerializer.Deserialize<MyBaseClass>(ref reader, options)会再次触发自定义转换器,形成无限递归导致栈溢出。要解决这个问题,核心是在反序列化基类实例时,临时移除自定义转换器。

具体实现步骤

在自定义转换器的逻辑中,针对基类的反序列化分支,创建一个排除当前转换器的新JsonSerializerOptions实例,用这个新选项完成基类的反序列化:

string objectType = readerClone.GetString();
if (objectType == "TypeBase")
{
    // 创建新的选项,移除当前的自定义转换器
    var baseOnlyOptions = new JsonSerializerOptions(options);
    baseOnlyOptions.Converters.Remove(baseOnlyOptions.Converters.First(c => c is MyBaseClassConverter));
    // 使用新选项反序列化基类,不会触发自定义转换器
    return JsonSerializer.Deserialize<MyBaseClass>(ref reader, baseOnlyOptions);
}
else if(objectType == "TypeA")
{
    return JsonSerializer.Deserialize<MyDerivedClassA>(ref reader, options);
}
else if (objectType == "TypeB")
{
    return JsonSerializer.Deserialize<MyDerivedClassB>(ref reader, options);
}
else
{
    throw new JsonException($"Invalid value {objectType} for ObjectType");
}

原理说明

  • 派生类(MyDerivedClassA/MyDerivedClassB)本身没有标记JsonConverter属性,调用JsonSerializer.Deserialize时会使用默认反序列化逻辑,不会触发自定义转换器,因此不存在递归问题。
  • 基类的反序列化通过新的JsonSerializerOptions排除了自定义转换器,转而使用默认逻辑处理,彻底避免了递归调用。

内容的提问来源于stack exchange,提问作者PaulH567

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 08:32:37