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:
- System.Exception.SerializeObjectState Zdarzenie
- BinaryFormatter.Serialize Metoda
- BinaryFormatter.Deserialize Metoda
- Formatter.Serialize(Stream, Object) Metoda
- Formatter.Deserialize(Stream) Metoda
- IFormatter.Serialize(Stream, Object) Metoda
- IFormatter.Deserialize(Stream) Metoda
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.
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
programem .
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 , 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 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 , 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 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 , BinaryFormatter niezależ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
- 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)