Formato de serialización predeterminado para TimeSpan

System.Text.Json se ha agregado compatibilidad con TimeSpan en .NET 6 GA; sin embargo, este cambio no incluye compatibilidad con los generadores de origen. En la versión de mantenimiento 6.0.2 de .NET 6, System.Text.Json incluye compatibilidad con la serialización de generadores de origen de los valores TimeSpan. Esta compatibilidad cambia el formato de serialización predeterminado para los valores TimeSpan de los generadores de origen.

Comportamiento anterior

En .NET 6 GA, los generadores de origen serializan los valores TimeSpan mediante la salida de todas las propiedades públicas del tipo, que es el comportamiento de serialización predeterminado de los objetos:

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

Comportamiento nuevo

En la versión de mantenimiento 6.0.2 de .NET, los generadores de origen serializan los valores TimeSpan en el siguiente formato, que es coherente con el formato de serializador basado en reflexión:

"2.00:00:01"

Versión introducida

.NET 6.0.2 (versión de mantenimiento)

Tipo de cambio importante

Este cambio puede afectar a la compatibilidad binaria.

Motivo del cambio

La generación del origen System.Text.Json es una nueva característica y su comportamiento de serialización debe ser lo más coherente posible con el serializador basado en reflexión. Este cambio simplifica la migración a los generadores de origen.

Es poco probable que los usuarios dependan del formato de serialización TimeSpan actual, ya que genera redundantemente todas las propiedades públicas del tipo (que es el comportamiento de serialización predeterminado para los objetos) y no realiza un recorrido de ida y vuelta.

Si depende del comportamiento existente, el curso de acción recomendado es crear un convertidor personalizado que genera las propiedades necesarias desde 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 afectadas

Consulte también