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
另请参阅
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈