Поделиться через


Формат сериализации по умолчанию для TimeSpan

System.Text.Json Добавлена поддержка в .NET 6 GA, однако это изменение не включало поддержку TimeSpan исходных генераторов. В версии 6.NET 6.0.2 System.Text.Json включена поддержка сериализации значений генератора TimeSpan источников. Это поддерживает изменение формата сериализации по умолчанию для TimeSpan значений в исходных генераторах.

Прежнее поведение

В общедоступной версии .NET 6 генераторы источников сериализуют TimeSpan значения путем вывода всех общедоступных свойств типа, что является поведением сериализации по умолчанию для объектов:

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

Новое поведение

В выпуске .NET 6.0.2 генераторы источников сериализуют TimeSpan значения в следующем формате, который соответствует формату сериализатора на основе отражения:

"2.00:00:01"

Представленные версии

.NET 6.0.2 (выпуск обслуживания)

Тип критического изменения

Это изменение может повлиять на совместимость двоичных файлов.

Причина изменения

Создание источника System.Text.Json — это новая функция, и его поведение сериализации должно быть максимально согласовано с сериализатором на основе отражения. Это изменение упрощает миграцию на исходные генераторы.

Маловероятно, что пользователи зависят от текущего TimeSpan формата сериализации, так как он избыточно выводит все общедоступные свойства типа (который является поведением сериализации по умолчанию для объектов), и он не округляет круглые результаты.

Если вы зависите от существующего поведения, рекомендуется создать настраиваемый преобразователь , который выводит необходимые свойства из 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

См. также