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
相关产品推荐
相关产品推荐

