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.
Empfohlene Maßnahme
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();
}
}