Format de sérialisation par défaut pour TimeSpan

System.Text.Json a ajouté le support de TimeSpan dans la disponibilité générale .NET 6, mais ce changement n’a pas inclus la prise en charge des générateurs sources. Dans la version de maintenance 6.0.2 de .NET 6, System.Text.Json inclut le support de la sérialisation des valeurs TimeSpan du générateur source. Ce support modifie le format de sérialisation par défaut pour les valeurs TimeSpan dans les générateurs sources.

Comportement précédent

Dans .NET 6 GA, les générateurs sources sérialisent les valeurs TimeSpan en sortant toutes les propriétés publiques du type, qui est le comportement de sérialisation par défaut pour les objets :

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

Nouveau comportement

Dans la version de maintenance .NET 6.0.2, les générateurs sources sérialisent les valeurs TimeSpan au format suivant, ce qui est cohérent avec le format de sérialiseur basé sur la réflexion :

"2.00:00:01"

Version introduite

.NET 6.0.2 (version de maintenance)

Type de changement cassant

Cette modification peut affecter la compatibilité binaire.

Raison du changement

La génération de source System.Text.Json est une nouvelle fonctionnalité et son comportement de sérialisation doit être aussi cohérent que possible avec le sérialiseur basé sur la réflexion. Ce changement simplifie la migration vers les générateurs sources.

Il est peu probable que les utilisateurs dépendent du format de sérialisation TimeSpan actuel, car il génère de manière redondante toutes les propriétés publiques du type (qui est le comportement de sérialisation par défaut pour les objets) et il n’effectue pas d’aller-retour.

Si vous dépendez du comportement existant, la procédure recommandée consiste à créer un convertisseur personnalisé qui génère les propriétés nécessaires à partir de 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();
    }
}

API affectées

Voir aussi