Partilhar via


Projetos PublishedTrimmed falham na serialização baseada em reflexão

Os projetos que habilitam a propriedade PublishTrimmed MSBuild agora desativam automaticamente os padrões baseados em reflexão de System.Text.Json. Em outras palavras, a configuração PublishTrimmed para true definir automaticamente a JsonSerializerIsReflectionEnabledByDefault propriedade MSBuild para false a menos que especificado de outra forma na configuração do projeto.

Comportamento anterior

Antes dessa alteração, os projetos que tinham a PublishTrimmed propriedade habilitada, ou seja, <PublishTrimmed>true</PublishTrimmed>publicavam um aplicativo cortado. No entanto, o comportamento de serialização padrão baseado em reflexão não foi necessariamente desabilitado. Dependendo do código cortado, o código a seguir pode ou não ter êxito na serialização, ou pode ou não produzir os dados de serialização corretos.

JsonSerializer.Serialize(new { Value = 42 });

Novo comportamento

A partir do .NET 8, os projetos que têm a propriedade habilitada PublishTrimmed falham completamente na serialização. O código JsonSerializer.Serialize(new { Value = 42 }); lança a seguinte exceção:

System.InvalidOperationException: A serialização baseada em reflexão foi desativada para este aplicativo.

Versão introduzida

.NET 8 Visualização 7

Tipo de mudança de rutura

Esta mudança é uma mudança comportamental.

Razão para a alteração

Essa alteração garante que os aplicativos cortados usem os padrões apropriados. Ele também orienta os usuários a adotar práticas recomendadas adequadas para aplicativos cortados, ou seja, usar o gerador de origem e evitar a dependência acidental dos componentes baseados em reflexão inseguros.

Para garantir que a serialização seja bem-sucedida, recomendamos que você migre seus aplicativos cortados para usar o gerador de origem.

No entanto, se você precisar usar reflexão, poderá reverter para o comportamento original habilitando explicitamente a JsonSerializerIsReflectionEnabledByDefault propriedade em seu arquivo de projeto:

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

APIs afetadas

N/A