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 预览版 7
中断性变更的类型
此更改为行为更改。
更改原因
此更改可确保剪裁的应用程序使用适当的默认值。 它还指导用户采用适用于剪裁的应用程序的最佳做法,即使用源生成器,并避免意外依赖基于不安全的反射组件。
建议的操作
为了确保序列化成功,建议迁移剪裁的应用程序以使用源生成器。
但是,如果必须使用反射,可以通过在项目文件中明确启用 JsonSerializerIsReflectionEnabledByDefault
属性来还原原始行为:
<PropertyGroup>
<PublishTrimmed>true</PublishTrimmed>
<JsonSerializerIsReflectionEnabledByDefault>true</JsonSerializerIsReflectionEnabledByDefault>
</PropertyGroup>
受影响的 API
不适用