Serializacja oparta na odbiciu odbicia projektów opublikowanychTrimmed kończy się niepowodzeniem
Projekty, które włączają właściwość PublishTrimmed MSBuild, automatycznie wyłączają wartości domyślne oparte na odbiciu pliku System.Text.Json. Innymi słowy, ustawienie na PublishTrimmed
true
wartość automatycznie ustawia JsonSerializerIsReflectionEnabledByDefault
właściwość MSBuild na false
wartość , chyba że określono inaczej w konfiguracji projektu.
Poprzednie zachowanie
Przed tą zmianą projekty, które mają włączoną PublishTrimmed
właściwość, czyli <PublishTrimmed>true</PublishTrimmed>
, opublikowały przyciętą aplikację. Jednak domyślne zachowanie serializacji oparte na odbiciu nie musi być wyłączone. W zależności od kodu, który został przycięty, poniższy kod może lub może nie zakończyć się serializacji lub może nie wygenerować poprawnych danych serializacji.
JsonSerializer.Serialize(new { Value = 42 });
Nowe zachowanie
Począwszy od platformy .NET 8, projekty z włączoną właściwością PublishTrimmed
serializacji kończą się niepowodzeniem. Kod JsonSerializer.Serialize(new { Value = 42 });
zgłasza następujący wyjątek:
System.InvalidOperationException: serializacja oparta na Emocje ion została wyłączona dla tej aplikacji.
Wprowadzona wersja
.NET 8 (wersja zapoznawcza 7)
Typ zmiany powodującej niezgodność
Ta zmiana jest zmianą behawioralną.
Przyczyna wprowadzenia zmiany
Ta zmiana gwarantuje, że przycięte aplikacje używają odpowiednich wartości domyślnych. Prowadzi również użytkowników do wdrażania najlepszych rozwiązań odpowiednich dla przycinanych aplikacji — czyli używania generatora źródła i unikania przypadkowej zależności od niebezpiecznych składników opartych na odbiciu.
Zalecana akcja
Aby zapewnić powodzenie serializacji, zalecamy przeprowadzenie migracji przyciętych aplikacji do korzystania z generatora źródłowego.
Jeśli jednak musisz użyć odbicia, możesz przywrócić oryginalne zachowanie, jawnie włączając JsonSerializerIsReflectionEnabledByDefault
właściwość w pliku projektu:
<PropertyGroup>
<PublishTrimmed>true</PublishTrimmed>
<JsonSerializerIsReflectionEnabledByDefault>true</JsonSerializerIsReflectionEnabledByDefault>
</PropertyGroup>
Dotyczy interfejsów API
Nie dotyczy