TimeSpan の既定のシリアル化形式

System.Text.Json によって .NET 6 GA で TimeSpan のサポートが追加されました。ただし、この変更にはソース ジェネレーターのサポートが含まれていませんでした。 .NET 6 サービス リリース 6.0.2 では、System.Text.Json に、TimeSpan 値のソースジェネレーター シリアル化のサポートが含まれます。 このサポートによって、ソース ジェネレーターの TimeSpan 値で既定のシリアル化形式が変更されます。

以前の動作

.NET 6 GA では、ソース ジェネレーターによって、オブジェクトの既定のシリアル化動作ですが、型のすべてのパブリック プロパティが出力され、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

関連項目

  • [System.Text.Json でソース生成を使用する方法](../../../../standard/serialization/system-text-json-source-generation.md)