TimeSpan 的默认序列化格式

System.Text.Json 在 .NET 6 GA 中添加了对 TimeSpan 的支持,但是此更改不包括对源生成器的支持。 在 .NET 6 维护版本 6.0.2 中,System.Text.Json 支持 TimeSpan 值的源生成器序列化。 这项支持更改了源生成器中 TimeSpan 值的默认序列化格式。

旧行为

在 .NET 6 GA 中,源生成器通过输出类型的所有公共属性来序列化 TimeSpan 值,这是对象的默认序列化行为:

{"days":2,"hours":0,"milliseconds":0,"minutes":0,"seconds":1,"ticks":1728010000000,"totalDays":2.0000115740740743,"totalHours":48.000277777777775,"totalMilliseconds":172801000,"totalMinutes":2880.016666666667,"totalSeconds":172801}

新行为

在维护版本 .NET 6.0.2 中,源生成器采用以下格式来序列化 TimeSpan 值,该格式与基于反射的序列化程序格式一致:

"2.00:00:01"

引入的版本

.NET 6.0.2(维护版本)

中断性变更的类型

此项更改可能会影响二进制兼容性。

更改原因

System.Text.Json 源生成是一项新功能,其序列化行为应尽量与基于反射的序列化程序保持一致。 这项更改简化了到源生成器的迁移。

用户不太可能依赖于当前的 TimeSpan 序列化格式,因为它会冗余输出类型的所有公共属性(这是对象的默认序列化行为),并且不会往返。

如果依赖于现有行为,建议的操作过程是创建一个自定义转换器,由它从 TimeSpan 输出所需的属性:

public class TimeSpanConverter : JsonConverter<TimeSpan>
{
    public void WriteValue(Utf8JsonWriter writer, TimeSpan value, JsonSerializerOptions options)
    {
        writer.WriteStartObject();
        writer.WriteNumber("days", value.Days);
        writer.WriteNumber("hours", value.Hours);
        /* insert any needed properties here */
        writer.WriteEndObject();
    }
}

受影响的 API

另请参阅