Standardserialisierungsformat für TimeSpan

System.Text.Json hat Unterstützung für TimeSpan in .NET 6 GA hinzugefügt, wobei diese Änderung jedoch keine Unterstützung für Quellen-Generatoren enthielt. In der .NET 6-Wartungsversion 6.0.2 enthält System.Text.Json Unterstützung für die Quellen-Generatorserialisierung von TimeSpan-Werten. Diese Unterstützung ändert das Standardserialisierungsformat für TimeSpan-Werte in Quellen-Generatoren.

Vorheriges Verhalten

In .NET 6 GA serialisieren Quellen-Generatoren TimeSpan-Werte, indem sie alle öffentlichen Eigenschaften des Typs ausgeben. Dies ist das Standardserialisierungsverhalten für Objekte:

{"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}

Neues Verhalten

In der Wartungsversion .NET 6.0.2 serialisieren Quellen-Generatoren TimeSpan-Werte im folgenden Format, das mit dem reflexionsbasierten Serialisierungsformat konsistent ist:

"2.00:00:01"

Eingeführt in Version

.NET 6.0.2 (Wartungsrelease)

Typ des Breaking Changes

Diese Änderung kann sich auf die binäre Kompatibilität auswirken.

Grund für die Änderung

Die System.Text.Json-Quellengenerierung ist ein neues Feature, dessen Serialisierungsverhalten auch so konsistent wie möglich mit dem reflexionsbasierten Serialisierer sein sollte. Diese Änderung vereinfacht die Migration zu Quellen-Generatoren.

Es ist unwahrscheinlich, dass Benutzer vom aktuellen TimeSpan-Serialisierungsformat abhängig sind, da es alle öffentlichen Eigenschaften des Typs redundant ausgibt (dies ist das Standardserialisierungsverhalten für Objekte) und keinen Roundtrip ausführt.

Wenn Sie vom vorhandenen Verhalten abhängig sind, empfiehlt es sich, einen benutzerdefinierten Konverter zu schreiben, der die erforderlichen Eigenschaften von TimeSpan ausgibt:

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();
    }
}

Betroffene APIs

Siehe auch