PublishedTrimmed プロジェクトがリフレクション ベースのシリアル化に失敗する
PublishTrimmed MSBuild プロパティを有効にするプロジェクトで、System.Text.Json のリフレクション ベースの既定値が自動的オフに設定されるようになりました。 つまり、プロジェクト構成で特に指定しない限り、PublishTrimmed
を true
に設定すると、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
該当なし
.NET