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