共用方式為


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:此應用程式的反映型序列化已停用。

導入的版本

.NET 8 Preview 7

中斷性變更的類型

此變更為行為變更

變更原因

這項變更可確保經過修剪的應用程式使用適當的預設值。 也會引導使用者採用適合已修剪應用程式的最佳做法,也就是使用來源產生器,且避免意外相依於不安全的反映型元件。

若要確保串行化成功,建議您移轉已修剪的應用程式以使用來源產生器。

不過,如果您必須使用反映,可在專案檔中明確啟用 JsonSerializerIsReflectionEnabledByDefault 屬性以還原成原始行為:

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

受影響的 API

N/A

另請參閱