Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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:
- zdarzenie System.Exception.SerializeObjectState
- Metoda BinaryFormatter.Serialize
- Metoda BinaryFormatter.Deserialize
- Metoda Formatter.Serialize(Stream, Object)
- Metoda Formatter.Deserialize(Stream)
- Metoda IFormatter.Serialize(Stream, Object)
- Metoda IFormatter.Deserialize(Stream)
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.
Zalecana akcja
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
- System.Exception.SerializeObjectState
- System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize
- System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize
- System.Runtime.Serialization.Formatter.Serialize(Stream, Object)
- System.Runtime.Serialization.Formatter.Deserialize(Stream)
- System.Runtime.Serialization.IFormatter.Serialize(Stream, Object)
- System.Runtime.Serialization.IFormatter.Deserialize(Stream)