Interfejsy API serializacji BinaryFormatter generują błędy kompilatora

W ramach długoterminowego planu wycofania binaryFormatter kontynuujemy cull BinaryFormatter funkcjonalność naszych bibliotek i odsunąć deweloperów od typu. Począwszy od platformy .NET 7, wywołania następujących interfejsów API generują błędy czasu kompilacji we wszystkich typach projektów C# i Visual Basic:

Poprzednie zachowanie

Ponieważ platforma .NET 5, używając dotkniętych Serialize metod i Deserialize opracowała ostrzeżenie kompilatora o identyfikatorze SYSLIB0011. Aby uzyskać więcej informacji, zobacz Metody serializacji BinaryFormatter są przestarzałe i zabronione w aplikacjach ASP.NET (.NET 5).

Exception.SerializeObjectState Użycie zdarzenia nie powoduje wystąpienia błędu.

Nowe zachowanie

Począwszy od platformy .NET 7, przy użyciu dowolnego z dotkniętych interfejsów API w kodzie występuje błąd kompilatora o tym samym identyfikatorze. SYSLIB0011 Twój projekt będzie miał wpływ, jeśli spełnia wszystkie następujące kryteria:

  • Jest to projekt w języku C# lub Visual Basic.
  • Jest ona przeznaczona net7.0 lub wyższa.
  • Wywołuje on bezpośrednio jeden z interfejsów API, których dotyczy problem.
  • Nie pomija jeszcze kodu ostrzegawczego SYSLIB0011 .

Wprowadzona wersja

.NET 7

Typ zmiany powodującej niezgodność

Ta zmiana może mieć wpływ na zgodność źródła.

Przyczyna wprowadzenia zmiany

W ramach długoterminowego planu wycofania binaryFormatter kontynuujemy cull BinaryFormatter funkcjonalność naszych bibliotek i odsunąć deweloperów od typu.

Najlepszym sposobem działania jest migracja z dala od BinaryFormatter ze względu na jego wady zabezpieczeń i niezawodności. BinaryFormatter może zostać usunięty z platformy .NET w przyszłej wersji. Zespół bibliotek platformy .NET podjął już stanowisko, że ostatnie typy, takie jak System.Half i System.DateOnly nie będą zgodne z BinaryFormatterprogramem .

Jeśli musisz pominąć błędy, możesz to zrobić, postępując zgodnie z wytycznymi w oryginalnym artykule dotyczącym obsoletion. Możesz również wyłączyć błąd dla całego projektu, ustawiając właściwość projektu, która konwertuje błąd z powrotem na ostrzeżenie (aby dopasować zachowanie platformy .NET 5/6).

Ostrzeżenie

Ustawienie tej właściwości może spowodować zmianę zachowania hosta. Zobacz <właściwość EnableUnsafeBinaryFormatterSerialization>.

<PropertyGroup>
    ...
    <EnableUnsafeBinaryFormatterSerialization>true</EnableUnsafeBinaryFormatterSerialization>
</PropertyGroup>

Uwaga

Jeśli projekt zostanie skompilowany z włączonym ustawieniem "ostrzeżenia jako błędy", kompilacja nadal zakończy się niepowodzeniem. (Jest to zgodne z zachowaniem dostarczonym w zestawach SDK platformy .NET 5 i .NET 6). Jeśli tak jest, nadal musisz pominąć SYSLIB0011 ostrzeżenie w źródle lub w elemecie pliku <NoWarn> projektu.

<EnableUnsafeBinaryFormatterSerialization> , właściwość

Właściwość została wprowadzona <EnableUnsafeBinaryFormatterSerialization na platformie .NET 5. W przypadku platformy .NET 7 zachowanie tego przełącznika zmieniło się w celu kontrolowania zachowania kompilacji i czasu wykonywania hosta . Znaczenie tego przełącznika różni się w zależności od typu projektu, zgodnie z opisem w poniższej tabeli.

Typ projektu Właściwość ustawiona na true Właściwość ustawiona na false Właściwość pominięta
Biblioteka/składnikudostępniony 1 Interfejsy API, których dotyczy problem, są przestarzałe jako ostrzeżenie. Kompilacja powiedzie się, chyba że dla aplikacji włączono "ostrzeżenia jako błędy" lub pominięto SYSLIB0011 kod ostrzegawczy. Interfejsy API, których dotyczy problem, są przestarzałe jako błąd, a wywołania z kodu do tych interfejsów API kończą się niepowodzeniem w czasie kompilacji, chyba że błąd zostanie pominięty. (Tak samo jak w przypadku . false)
AplikacjeBlazor i MAUI 2 Wywołania do elementu nie BinaryFormatter będą działać w czasie wykonywania. Wywołania do elementu nie BinaryFormatter będą działać w czasie wykonywania. Wywołania do elementu nie BinaryFormatter będą działać w czasie wykonywania.
Aplikacja ASP.NET Interfejsy API, których dotyczy problem, są przestarzałe jako ostrzeżenie. Kompilacja powiedzie się, chyba że dla aplikacji włączono "ostrzeżenia jako błędy" lub pominięto SYSLIB0011 kod ostrzegawczy. Środowisko uruchomieniowe będzie zezwalać na wywołania , BinaryFormatterniezależnie od tego, czy wywołanie pochodzi z kodu, czy z zależności, z której korzystasz. Interfejsy API, których dotyczy problem, są przestarzałe jako błąd, a wywołania z kodu do tych interfejsów API kończą się niepowodzeniem w czasie kompilacji, chyba że błąd zostanie pominięty. Środowisko uruchomieniowe zabrania wywołań funkcji BinaryFormatter, niezależnie od tego, czy wywołanie pochodzi z kodu, czy z zależności, z której korzystasz. (Tak samo jak w przypadku . false)
Aplikacje klasyczne i wszystkie inne typy aplikacji Interfejsy API, których dotyczy problem, są przestarzałe jako ostrzeżenie. Kompilacja powiedzie się, chyba że dla aplikacji włączono "ostrzeżenia jako błędy" lub pominięto SYSLIB0011 kod ostrzegawczy. Środowisko uruchomieniowe będzie zezwalać na wywołania , BinaryFormatterniezależnie od tego, czy wywołanie pochodzi z kodu, czy z zależności, z której korzystasz. Interfejsy API, których dotyczy problem, są przestarzałe jako błąd, a wywołania z kodu do tych interfejsów API kończą się niepowodzeniem w czasie kompilacji, chyba że błąd zostanie pominięty. Środowisko uruchomieniowe zabrania wywołań funkcji BinaryFormatter, niezależnie od tego, czy wywołanie pochodzi z kodu, czy z zależności, z której korzystasz. Interfejsy API, których dotyczy problem, są przestarzałe jako błąd, a wywołania z kodu do tych interfejsów API kończą się niepowodzeniem w czasie kompilacji, chyba że błąd zostanie pominięty. Środowisko uruchomieniowe będzie zezwalać na wywołania , BinaryFormatterniezależnie od tego, czy wywołanie pochodzi z kodu, czy z zależności, z której korzystasz.

1Zasady środowiska uruchomieniowego są kontrolowane przez hosta aplikacji. Wywołania w BinaryFormatter programie mogą nadal prowadzić do awarii w czasie wykonywania, nawet jeśli <EnableUnsafeBinaryFormatterSerialization> jest ustawiona na true wartość w pliku projektu biblioteki. Biblioteki nie mogą zastąpić zasad środowiska uruchomieniowego hosta aplikacji.

2Środowiska uruchomieniowe Blazor i MAUI zabraniają wywołań .BinaryFormatter Niezależnie od wartości ustawionej dla <EnableUnsafeBinaryFormatterSerialization>parametru wywołania kończą się niepowodzeniem w czasie wykonywania. Nie należy wywoływać tych interfejsów API z aplikacji Blazor lub MAUI ani bibliotek przeznaczonych do korzystania z aplikacji Blazor lub MAUI.

Dotyczy interfejsów API

Zobacz też