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

另請參閱