Udostępnij za pośrednictwem


API serializacji BinaryFormatter powodują błędy kompilatora

W ramach długoterminowego planu wycofania BinaryFormatter kontynuujemy usuwanie funkcjonalności z naszych bibliotek i odsuwanie deweloperów od tego 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

Od wersji .NET 5, użycie związanych Serialize i Deserialize metod powoduje ostrzeżenie kompilatora o identyfikatorze . Aby uzyskać więcej informacji, zobacz Metody serializacji BinaryFormatter są przestarzałe i zabronione w aplikacjach ASP.NET (.NET 5).

Użycie Exception.SerializeObjectState zdarzenia nie spowodowało 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 nakierowana na net7.0 lub wyżej.
  • Wywołuje on bezpośrednio jeden z interfejsów API, których dotyczy problem.
  • Jeszcze nie tłumi kodu ostrzegawczego SYSLIB0011.

Wersja wprowadzona

.NET 7

Typ zmiany przełamującej

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

Przyczyna zmiany

W ramach długoterminowego planu wycofania BinaryFormatter kontynuujemy usuwanie funkcjonalności z naszych bibliotek i odsuwanie deweloperów od tego 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 BinaryFormatter.

Jeśli musisz zignorować błędy, możesz to zrobić, postępując zgodnie z wytycznymi zawartymi w oryginalnym artykule dotyczącym przestarzałości. 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 / Notatka

Jeśli projekt zostanie skompilowany przy włączonym ustawieniu "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 wyłączyć SYSLIB0011 ostrzeżenie w źródle lub w elemencie pliku <NoWarn> projektu.

<EnableUnsafeBinaryFormatterSerialization> właściwość

Właściwość <EnableUnsafeBinaryFormatterSerialization została wprowadzona w .NET 5. W przypadku platformy .NET 7 zachowanie tego przełącznika zmieniło się, aby kontrolować zarówno czas kompilacji, jak i czas wykonywania na hoście. 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ładnik udostępniony1 Interfejsy API, których dotyczy problem, są przestarzałe i pełnią funkcję ostrzeżenia. Kompilacja zakończy się sukcesem, chyba że w aplikacji włączono traktowanie ostrzeżeń jako błędów lub wyłączono lub zignorowano kod ostrzegawczy SYSLIB0011. 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)
Aplikacje Blazor i MAUI2 Wywołania do BinaryFormatter będą zawodzić w czasie wykonywania. Wywołania do BinaryFormatter będą zawodzić w czasie wykonywania. Wywołania do BinaryFormatter będą zawodzić w czasie wykonywania.
Aplikacja ASP.NET Interfejsy API, których dotyczy problem, są przestarzałe i pełnią funkcję ostrzeżenia. Kompilacja zakończy się sukcesem, chyba że w aplikacji włączono traktowanie ostrzeżeń jako błędów lub wyłączono lub zignorowano kod ostrzegawczy SYSLIB0011. Środowisko uruchomieniowe będzie zezwalać na wywołaniaBinaryFormatter, niezależnie od tego, czy wywołanie pochodzi z twojego 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ń do BinaryFormatter, bez względu na to, czy wywołanie pochodzi z twojego kodu, czy z zależności, z której korzystasz. (Tak samo jak w przypadku . false)
Aplikacje na komputery stacjonarne i wszystkie inne rodzaje aplikacji Interfejsy API, których dotyczy problem, są przestarzałe i pełnią funkcję ostrzeżenia. Kompilacja zakończy się sukcesem, chyba że w aplikacji włączono traktowanie ostrzeżeń jako błędów lub wyłączono lub zignorowano kod ostrzegawczy SYSLIB0011. Środowisko uruchomieniowe będzie zezwalać na wywołaniaBinaryFormatter, niezależnie od tego, czy wywołanie pochodzi z twojego 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ń do BinaryFormatter, bez względu na to, czy wywołanie pochodzi z twojego 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łaniaBinaryFormatter, niezależnie od tego, czy wywołanie pochodzi z twojego 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 jakiejkolwiek wartości ustawionej dla <EnableUnsafeBinaryFormatterSerialization>, wywołania zakończą się niepowodzeniem w czasie wykonywania. Nie wywołuj tych interfejsów API z aplikacji Blazor lub MAUI ani z bibliotek przeznaczonych do używania w aplikacjach Blazor lub MAUI.

Interfejsy API, których dotyczy problem

Zobacz także