Sdílet prostřednictvím


Výchozí formát serializace pro TimeSpan

System.Text.Json přidání podpory pro TimeSpan v .NET 6 GA, ale tato změna nezahrnuje podporu pro generátory zdrojů. V rozhraní .NET 6 servisní verze 6.0.2 System.Text.Json zahrnuje podporu serializace hodnot generátoru TimeSpan zdroje. Tato podpora změní výchozí formát serializace pro TimeSpan hodnoty ve zdrojových generátorech.

Předchozí chování

V .NET 6 GA zdrojové generátory serializují TimeSpan hodnoty výstupem všech veřejných vlastností typu, což je výchozí serializace chování pro objekty:

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

Nové chování

V servisní verzi .NET 6.0.2 generátory zdroje serializují TimeSpan hodnoty v následujícím formátu, což je konzistentní s formátem serializátoru založeného na reflexi:

"2.00:00:01"

Zavedená verze

.NET 6.0.2 (servisní verze)

Typ zásadní změny

Tato změna může ovlivnit binární kompatibilitu.

Důvod změny

Generování zdroje System.Text.Json je nová funkce a její serializace chování by mělo být co nejkonzistence s serializátorem založeným na reflexi. Tato změna zjednodušuje migraci na generátory zdrojů.

Je nepravděpodobné, že uživatelé budou záviset na aktuálním TimeSpan formátu serializace, protože redundantně vypíše všechny veřejné vlastnosti typu (což je výchozí chování serializace pro objekty) a neprovádí roundtrip.

Pokud závisíte na existujícím chování, doporučeným samozřejmě je vytvoření vlastního převaděče , který vypíše potřebné vlastnosti z 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();
    }
}

Ovlivněná rozhraní API

Viz také