Partager via


Les projets PublishedTrimmed ne peuvent pas avoir de sérialisation basée sur la réflexion

Les projets qui activent la propriété MSBuild PublishTrimmed désactivent maintenant automatiquement les valeurs par défaut basées sur la réflexion de System.Text.Json. En d’autres termes, la définition de PublishTrimmed sur true définit automatiquement la propriété MSBuild JsonSerializerIsReflectionEnabledByDefault sur false, sauf indication contraire dans la configuration du projet.

Comportement précédent

Avant ce changement, les projets dont la propriété PublishTrimmed était activée, autrement dit, <PublishTrimmed>true</PublishTrimmed>, publiaient une application découpée. Toutefois, le comportement de sérialisation par défaut basé sur la réflexion n’était pas nécessairement désactivé. En fonction du code qui était découpé, le code suivant pouvait ou non réussir la sérialisation, ou pouvait ou non générer les données de sérialisation appropriées.

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

Nouveau comportement

Depuis .NET 8, les projets dont la propriété PublishTrimmed est activée ne peuvent pas être sérialisés du tout. Le code JsonSerializer.Serialize(new { Value = 42 }); lève l’exception suivante :

System.InvalidOperationException : la sérialisation basée sur la réflexion a été désactivée pour cette application.

Version introduite

.NET 8 Preview 7

Type de changement cassant

Ce changement est un changement de comportement.

Raison du changement

Ce changement garantit que les applications découpées utilisent les valeurs par défaut appropriées. Il encourage également les utilisateurs à adopter les bonnes pratiques adaptées aux applications découpées, c’est-à-dire utiliser le générateur de source et éviter une dépendance accidentelle sur les composants non sécurisés basés sur la réflexion.

Pour que la sérialisation réussisse, nous vous recommandons de migrer vos applications découpées pour qu’elles utilisent le générateur de source.

Toutefois, si vous devez utiliser la réflexion, vous pouvez revenir au comportement d’origine en activant explicitement la propriété JsonSerializerIsReflectionEnabledByDefault dans votre fichier projet :

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

API affectées

N/A