PublishedTrimmed プロジェクトがリフレクション ベースのシリアル化に失敗する

PublishTrimmed MSBuild プロパティを有効にするプロジェクトで、System.Text.Json のリフレクション ベースの既定値が自動的オフに設定されるようになりました。 つまり、プロジェクト構成で特に指定しない限り、PublishTrimmedtrue に設定すると、JsonSerializerIsReflectionEnabledByDefault MSBuild プロパティが自動的に false に設定されます。

以前の動作

この変更が行われる前は、PublishTrimmed プロパティが有効になっているプロジェクト (つまり、<PublishTrimmed>true</PublishTrimmed>) は、トリミングされたアプリケーションを発行していました。 ただし、リフレクション ベースの既定のシリアル化動作は、必ずしも無効にされていませんでした。 どのコードがトリミングされるかによって、次のコードはシリアル化に成功する場合もしない場合もあり、正しいシリアル化データを出力する場合もしない場合もあります。

JsonSerializer.Serialize(new { Value = 42 });

新しい動作

.NET 8 以降、PublishTrimmed プロパティが有効になっているプロジェクトでは、シリアル化は必ず失敗します。 コード JsonSerializer.Serialize(new { Value = 42 }); は、次の例外をスローします。

System.InvalidOperationException: Reflection-based serialization has been disabled for this application. (このアプリケーションでは、リフレクション ベースのシリアル化は無効になっています。)

導入されたバージョン

.NET 8 Preview 7

破壊的変更の種類

この変更は、動作変更です。

変更理由

この変更により、トリミングされたアプリケーションで適切な既定値が使用されるようになります。 また、トリミングされたアプリケーションに適したベスト プラクティスを採用するようにユーザーを導きます。つまり、ソース ジェネレーターを使用し、安全でないリフレクション ベースのコンポーネントへの偶発的な依存関係を回避するようにします。

シリアル化が正常に実行されるように、トリミングされたアプリケーションを移行して、ソース ジェネレーターを使用するようにすることをお勧めします。

ただし、リフレクションを使用する必要がある場合は、次のように、プロジェクト ファイルで JsonSerializerIsReflectionEnabledByDefault プロパティを明示的に有効にすることで、元の動作に戻すことができます。

<PropertyGroup>
  <PublishTrimmed>true</PublishTrimmed>
  <JsonSerializerIsReflectionEnabledByDefault>true</JsonSerializerIsReflectionEnabledByDefault>
</PropertyGroup>

影響を受ける API

該当なし