Udostępnij za pośrednictwem


Domyślny format serializacji timeSpan

System.Text.Json dodano obsługę w TimeSpan programie .NET 6 GA, jednak ta zmiana nie obejmowała obsługi generatorów źródeł. W programie .NET 6 obsługa wersji 6.0.2 System.Text.Json obejmuje obsługę serializacji TimeSpan wartości generatora źródła. Ta obsługa zmienia domyślny format serializacji wartości TimeSpan w generatorach źródłowych.

Poprzednie zachowanie

W programie .NET 6 GA generatory źródłowe serializują TimeSpan wartości, wyprowadzając wszystkie właściwości publiczne typu, co jest domyślnym zachowaniem serializacji dla obiektów:

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

Nowe zachowanie

W wersji obsługi .NET 6.0.2 generatory źródłowe serializują TimeSpan wartości w następującym formacie, który jest zgodny z formatem serializatora opartego na odbiciu:

"2.00:00:01"

Wprowadzona wersja

.NET 6.0.2 (wersja serwisowa)

Typ zmiany powodującej niezgodność

Ta zmiana może mieć wpływ na zgodność binarną.

Przyczyna wprowadzenia zmiany

Generowanie źródła System.Text.Json jest nową funkcją, a jej zachowanie serializacji powinno być tak spójne, jak to możliwe w przypadku serializatora opartego na odbiciu. Ta zmiana upraszcza migrację do generatorów źródłowych.

Jest mało prawdopodobne, aby użytkownicy zależeli od bieżącego TimeSpan formatu serializacji, ponieważ nadmiarowo generuje wszystkie publiczne właściwości typu (co jest domyślnym zachowaniem serializacji obiektów) i nie jest to dwukierunkowe.

Jeśli zależysz od istniejącego zachowania, zalecanym kursem akcji jest utworzenie niestandardowego konwertera, który wyprowadza wymagane właściwości 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();
    }
}

Dotyczy interfejsów API

Zobacz też