Compartilhar via


Formato de serialização padrão para TimeSpan

System.Text.Json adicionou suporte para TimeSpan no .NET 6 GA; no entanto, essa alteração não incluiu suporte para geradores de código-fonte. 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 dos valores TimeSpan em geradores de código fonte.

Comportamento anterior

No .NET 6 GA, os geradores de origem serializam TimeSpan valores gerando 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 mudança disruptiva

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

Motivo da alteração

A geração de código fonte do System.Text.Json é uma nova funcionalidade, e seu comportamento de serialização deve 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 produz 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

Consulte também