Condividi tramite


Formato di serializzazione predefinito per TimeSpan

System.Text.Json ha aggiunto il supporto per TimeSpan in .NET 6 GA, tuttavia questa modifica non includeva il supporto per i generatori di origine. Nella versione di manutenzione 6.0.2 di .NET 6, System.Text.Json include il supporto per la serializzazione dei generatori di origine dei valori TimeSpan. Questo supporto modifica il formato di serializzazione predefinito per i valori TimeSpan nei generatori di origine.

Comportamento precedente

In .NET 6 GA, i generatori di origine serializzano i valori TimeSpan visualizzando tutte le proprietà pubbliche del tipo, ovvero il comportamento di serializzazione predefinito per gli oggetti:

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

Nuovo comportamento

Nella versione di manutenzione .NET 6.0.2, i generatori di origine serializzano i valori TimeSpan nel formato seguente, coerente con il formato del serializzatore basato sulla reflection:

"2.00:00:01"

Versione introdotta

.NET 6.0.2 (versione di manutenzione)

Tipo di modifica che causa un'interruzione

Questa modifica potrebbe influire sulla compatibilità binaria.

Motivo della modifica

La generazione di origine System.Text.Json è una nuova funzionalità e il suo comportamento di serializzazione deve essere il più coerente possibile con il serializzatore basato sulla reflection. Questa modifica semplifica la migrazione ai generatori di origine.

È improbabile che gli utenti dipendano dal formato di serializzazione TimeSpan corrente, perché restituisce in modo ridondante tutte le proprietà pubbliche del tipo (ovvero il comportamento di serializzazione predefinito per gli oggetti) e non esegue il round trip.

Se dipendi dal comportamento esistente, la linea d’azione consigliata consiste nel creare un convertitore personalizzato che restituisce le proprietà necessarie da 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 interessate

Vedi anche