Compartilhar via


Formato de serialização padrão para TimeSpan

System.Text.Json adicionou suporte para TimeSpan no .NET 6 GA, porém, essa alteração não incluiu suporte para geradores de origem. Na versão 6.0.2 de manutenção do .NET 6, System.Text.Json inclui suporte para serialização de gerador de origem de valores TimeSpan. Esse suporte altera o formato de serialização padrão para valores TimeSpan em geradores de origem.

Comportamento anterior

No GA do .NET 6, os geradores de origem serializam valores TimeSpan emitindo todas as propriedades públicas do tipo, que é o comportamento de serialização padrão para 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}

Novo comportamento

Na versão de manutenção do .NET 6.0.2, os geradores de origem serializam valores TimeSpan no seguinte formato, que é consistente com o formato de serializador baseado em reflexão:

"2.00:00:01"

Versão introduzida

.NET 6.0.2 (versão de manutenção)

Tipo de alteração interruptiva

Esta alteração pode afetar a compatibilidade binária.

Motivo da alteração

A geração de origem System.Text.Json é um novo recurso e o comportamento de serialização deverá ser o mais consistente possível com o serializador baseado em reflexão. Essa alteração simplifica a migração para geradores de origem.

É improvável que os usuários dependam do formato de serialização atual TimeSpan, pois ele gera de forma redundante todas as propriedades públicas do tipo (que é o comportamento de serialização padrão para objetos) e não faz viagem de ida e volta.

Se você depender do comportamento existente, o curso de ação recomendado será criar um conversor personalizado que produza as propriedades necessárias 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();
    }
}

APIs afetadas

Confira também