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.
Action recommandée
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