Freigeben über


Fehler bei reflexionsbasierter Serialisierung von PublishedTrimmed-Projekten

Projekte, die die MSBuild-Eigenschaft PublishTrimmed aktivieren, deaktivieren jetzt automatisch die reflexionsbasierten Standardwerte von System.Text.Json. Mit anderen Worten: Durch Festlegen von PublishTrimmed auf true, wird die MSBuild-Eigenschaft JsonSerializerIsReflectionEnabledByDefault automatisch auf ffalse estgelegt, sofern nicht anders in der Projektkonfiguration angegeben.

Vorheriges Verhalten

Vor dieser Änderung haben Projekte, bei denen die Eigenschaft PublishTrimmed aktiviert ist, d. h. <PublishTrimmed>true</PublishTrimmed>, eine gekürzte Anwendung veröffentlicht. Das reflexionsbasierte Standardserialisierungsverhalten wurde jedoch nicht notwendigerweise deaktiviert. Je nachdem, welcher Code gekürzt wurde, kann der folgende Code die Serialisierung möglicherweise erfolgreich ausführen oder die richtigen Serialisierungsdaten ausgeben.

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

Neues Verhalten

Ab .NET 8 schlägt bei Projekten, bei denen die Eigenschaft PublishTrimmed aktiviert ist, die Serialisierung direkt fehl. Der Code JsonSerializer.Serialize(new { Value = 42 }); löst die folgende Ausnahme aus:

System.InvalidOperationException: Die reflexionsbasierte Serialisierung wurde für diese Anwendung deaktiviert.

Eingeführt in Version

.NET 8 Preview 7

Typ des Breaking Changes

Diese Änderung ist eine Verhaltensänderung.

Grund für die Änderung

Diese Änderung stellt sicher, dass gekürzte Anwendungen die geeigneten Standardwerte verwenden. Außerdem werden Benutzer*innen dazu angehalten, bewährte Methoden zu übernehmen, die für gekürzte Anwendungen geeignet sind: d. h. den Quellgenerator verwenden und versehentliche Abhängigkeiten von den unsicheren reflexionsbasierten Komponenten vermeiden.

Um sicherzustellen, dass die Serialisierung erfolgreich ist, empfehlen wir, dass Sie Ihre gekürzten Anwendungen migrieren, um den Quellgenerator zu verwenden.

Wenn Sie die Reflexion jedoch verwenden müssen, können Sie das ursprüngliche Verhalten rückgängig machen, indem Sie die Eigenschaft JsonSerializerIsReflectionEnabledByDefault in der Projektdatei explizit aktivieren:

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

Betroffene APIs

Weitere Informationen