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

System.Text.Json源生成模式下TimeSpan序列化_ticks访问错误如何解决?

问题根因

这是.NET 6、.NET 7版本中System.Text.Json源生成器的已知缺陷:源生成器没有正确识别TimeSpan的内置转换器,错误尝试直接序列化其私有字段_ticks。哪怕对应属性标记了[JsonIgnore],源生成器扫描类型依赖时依旧会为TimeSpan生成错误的序列化逻辑,导致编译报错。

可行解决方案
  • 方案1:升级依赖版本(最简便)
    该问题已在.NET 8及以上版本修复,你可以直接升级项目目标框架到.NET 8+,或是单独将System.Text.JsonNuGet包升级到8.0.0及以上版本,无需修改业务代码即可解决问题。
  • 方案2:注册自定义TimeSpan转换器(兼容旧版本)
    如果你无法升级框架版本,可以手动实现TimeSpan的序列化转换器,显式告知源生成器使用该转换器处理TimeSpan类型,不再自动生成错误的序列化逻辑:
    首先实现自定义转换器:
    using System.Text.Json;
    using System.Text.Json.Serialization;
    
    public class TimeSpanJsonConverter : JsonConverter<TimeSpan>
    {
        public override TimeSpan Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
        {
            // 可根据业务需要调整为读取Ticks格式:return TimeSpan.FromTicks(reader.GetInt64());
            return TimeSpan.Parse(reader.GetString()!);
        }
    
        public override void Write(Utf8JsonWriter writer, TimeSpan value, JsonSerializerOptions options)
        {
            // 可根据业务需要调整为输出Ticks格式:writer.WriteNumberValue(value.Ticks);
            writer.WriteStringValue(value.ToString());
        }
    }
    
    然后在序列化上下文上添加配置,注册该转换器:
    [JsonSourceGenerationOptions(Converters = new[] { typeof(TimeSpanJsonConverter) })]
    [JsonSerializable(typeof(Test))]
    partial class Context : JsonSerializerContext
    {
    }
    
  • 方案3:调整源生成模式(仅适用于不需要序列化任何TimeSpan的场景)
    如果你项目中完全不需要序列化TimeSpan类型,可以将源生成模式调整为仅生成元数据,结合你已经添加的[JsonIgnore]注解即可正常运行:
    [JsonSourceGenerationOptions(GenerationMode = JsonSourceGenerationMode.Metadata)]
    [JsonSerializable(typeof(Test))]
    partial class Context : JsonSerializerContext
    {
    }
    
    该模式下源生成器只会为你显式指定的类型生成基础元数据,不会为依赖的TimeSpan自动生成序列化逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 01:06:05