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

不适用

另请参阅