Format de sérialisation par défaut pour TimeSpan

System.Text.Json a ajouté la prise en charge de TimeSpan dans .NET 6 GA, mais cette modification n’incluait pas la prise en charge des générateurs de source. 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 de code source sérialisent TimeSpan les valeurs en émettant toutes les propriétés publiques du type, ce 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 service .NET 6.0.2, les générateurs de code source sérialisent les valeurs TimeSpan selon le format suivant, 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 de la modification

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. Cette modification simplifie la migration vers les générateurs sources.

Il est peu probable que les utilisateurs dépendent du format de sérialisation actuel TimeSpan , 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, le cours d’action recommandé est de 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