PublishedTrimmed-projekt misslyckas med reflektionsbaserad serialisering
Projekt som aktiverar egenskapen PublishTrimmed MSBuild inaktiverar nu automatiskt de reflektionsbaserade standardvärdena för System.Text.Json. Med andra ord anger PublishTrimmed
inställningen true
till JsonSerializerIsReflectionEnabledByDefault
automatiskt egenskapen MSBuild till false
om inget annat anges i projektkonfigurationen.
Tidigare beteende
Före den här ändringen publicerade projekt som har PublishTrimmed
egenskapen aktiverad, d.v.s <PublishTrimmed>true</PublishTrimmed>
. , ett trimmat program. Det reflektionsbaserade standard serialiseringsbeteendet har dock inte nödvändigtvis inaktiverats. Beroende på vilken kod som trimmats kan följande kod eller kanske inte lyckas serialiseras, eller kanske inte matar ut rätt serialiseringsdata.
JsonSerializer.Serialize(new { Value = 42 });
Nytt beteende
Från och med .NET 8 misslyckas projekt som har egenskapen PublishTrimmed
aktiverad serialisering direkt.
JsonSerializer.Serialize(new { Value = 42 });
Koden genererar följande undantag:
System.InvalidOperationException: Reflektionsbaserad serialisering har inaktiverats för det här programmet.
Version introducerad
.NET 8 Förhandsversion 7
Typ av icke-bakåtkompatibel ändring
Den här ändringen är en beteendeförändring.
Orsak till ändringen
Den här ändringen säkerställer att trimmade program använder lämpliga standardvärden. Den vägleder också användarna till att införa metodtips som är lämpliga för trimmade program, dvs. använd källgeneratorn och undvika oavsiktligt beroende av de osäkra reflektionsbaserade komponenterna.
Rekommenderad åtgärd
För att säkerställa att serialiseringen lyckas rekommenderar vi att du migrerar dina trimmade program för att använda källgeneratorn.
Men om du måste använda reflektion kan du återgå till det ursprungliga beteendet genom att uttryckligen JsonSerializerIsReflectionEnabledByDefault
aktivera egenskapen i projektfilen:
<PropertyGroup>
<PublishTrimmed>true</PublishTrimmed>
<JsonSerializerIsReflectionEnabledByDefault>true</JsonSerializerIsReflectionEnabledByDefault>
</PropertyGroup>
Berörda API:er
Ej tillämpligt