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