Dela via


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.

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

Se även