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 define automaticamente a propriedade MSBuild JsonSerializerIsReflectionEnabledByDefault como false, a menos que seja especificada de outra forma na configuração do projeto.

Comportamento anterior

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

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

Novo comportamento

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

System.InvalidOperationException: a serialização baseada em reflexão foi desabilitada para este aplicativo.

Versão introduzida

Prévia 7 do .NET 8

Tipo de alteração interruptiva

Esta é uma alteração comportamental.

Motivo da alteração

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

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 a reflexão, poderá reverter para o comportamento original habilitando explicitamente a propriedade JsonSerializerIsReflectionEnabledByDefault em seu arquivo de projeto:

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

APIs afetadas

N/D