Udostępnij za pośrednictwem


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 PublishTrimmedtrue 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.

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