Aracılığıyla paylaş


TimeSpan için varsayılan serileştirme biçimi

System.Text.Json için .NET 6 GA desteği TimeSpan eklendi, ancak bu değişiklik kaynak oluşturucular için destek içermiyor. .NET 6 servicing release 6.0.2 sürümünde, System.Text.Json değerlerin kaynak oluşturucu serileştirmesi TimeSpan için destek içerir. Bu destek, kaynak oluşturuculardaki değerler için TimeSpan varsayılan serileştirme biçimini değiştirir.

Önceki davranış

.NET 6 GA'da kaynak oluşturucular, nesnelerin varsayılan serileştirme davranışı olan türün tüm genel özelliklerini çıkararak değerleri seri hale getirmektedir 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}

Yeni davranış

.NET 6.0.2 hizmet sürümünde, kaynak oluşturucular değerleri yansıma tabanlı serileştirici biçimiyle tutarlı olan aşağıdaki biçimde serileştirir TimeSpan :

"2.00:00:01"

Sürüm kullanıma sunulmuştur

.NET 6.0.2 (bakım sürümü)

Hataya neden olan değişikliğin türü

Bu değişiklik ikili uyumluluğu etkileyebilir.

Değişiklik nedeni

System.Text.Json kaynak oluşturma yeni bir özelliktir ve serileştirme davranışı yansıma tabanlı seri hale getirici ile mümkün olduğunca tutarlı olmalıdır. Bu değişiklik, kaynak oluşturuculara geçişi basitleştirir.

Kullanıcıların geçerli TimeSpan serileştirme biçimine bağımlı olma olasılığı düşüktür çünkü türün tüm genel özelliklerini yedekli olarak çıkarmaktadır (nesneler için varsayılan serileştirme davranışıdır) ve gidiş dönüş yoktur.

Mevcut davranışa bağlıysanız, önerilen eylem kursu, 'den TimeSpangerekli özelliklerin çıkışını veren özel bir dönüştürücü yazmaktır:

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();
    }
}

Etkilenen API’ler

Ayrıca bkz.