Windows Forms Przewodnik migracji dla BinaryFormatter
BinaryFormatter usunięcie
Począwszy od platformy .NET 9, BinaryFormatter nie jest już obsługiwany ze względu na znane zagrożenia bezpieczeństwa, a jego interfejsy API zawsze zgłaszają wyjątek PlatformNotSupportedException dla wszystkich typów projektów, w tym Windows Forms aplikacji. Aby uzyskać więcej informacji na temat czynników ryzyka BinaryFormatter i przyczyny jego usunięcia, zobacz BinaryFormatter przewodnik migracji.
W przypadku BinaryFormatterusunięcia oczekuje się, że będzie miało to wpływ na wiele Windows Forms aplikacji i musisz podjąć działania w celu ukończenia migracji do platformy .NET 9 lub nowszej wersji.
Wpływ BinaryFormatterWindows Forms
Przed platformą .NET 9 Windows Forms używane BinaryFormatter do serializacji i deserializacji danych w scenariuszach takich jak schowek, przeciąganie i upuszczanie oraz przechowywanie lub ładowanie zasobów w czasie projektowania. Począwszy od platformy .NET 9 i Windows Forms WPF, należy wewnętrznie użyć podzbioru BinaryFormatter implementacji w tych scenariuszach. Chociaż BinaryFormatternie można rozwiązać ryzyka w serializacji/deserializacji ogólnego przeznaczenia, podjęto środki w celu ograniczenia ryzyka w tych bardzo konkretnych przypadkach użycia ze znanym zestawem typów. Powrót do BinaryFormatter jest nadal w miejscu dla nieznanych lub nieobsługiwanych typów, co spowoduje zgłaszanie wyjątków, chyba że kroki migracji zostaną podjęte w aplikacji.
Windows Forms aplikacje WPF obsługują następujące typy wraz z tablicami i listami tych typów. Zasoby schowka, przeciągania i upuszczania oraz czasu projektowania będą nadal pracować z tymi typami bez konieczności wykonywania żadnych kroków migracji.
bool
byte
char
decimal
double
int
sbyte
float
- TimeSpan
- DateTime
uint
string
nint
nuint
long
ulong
short
ushort
- PointF
- RectangleF
Windows Forms Obsługuje również następujące dodatkowe typy:
Scenariusze OLE
Aby uzyskać informacje na temat skutków BinaryFormatter usuwania w scenariuszach OLE, takich jak schowek i przeciąganie i upuszczanie, a także wskazówki dotyczące migracji, zobacz Windows Forms i Wskazówki dotyczące ole programu Windows Presentation FoundationBinaryFormatter.
Zasoby (ResX)
Windows Forms Projektant
Projektant Windows Forms out-of-process używa BinaryFormatter również wewnętrznie do serializacji i deserializacji ResX.
Typy i właściwości mogą uczestniczyć w serializacji, nie zdając sobie sprawy ze standardowego zachowania projektanta Windows Forms . Jednym ze sposobów, o których BinaryFormatter można nie wiedzieć, jest public
wprowadzenie właściwości IComponent i wypełnienie lub edytowanie właściwości w czasie projektowania. Ta właściwość jest serializowana w plikach zasobów w następujących warunkach:
- Właściwość publiczna zawiera dane w momencie Form zapisania elementu w projektancie.
- Ta właściwość nie jest tylko do odczytu.
- Ta właściwość nie jest przypisywana za pomocą polecenia
[DesignerSerializationVisibility(false)]
. - Ta właściwość nie ma elementu DefaultValueAttribute.
- Ta właściwość nie ma odpowiedniej
bool ShouldSerialize[PropertyName]
metody, która zwracafalse
w czasie procesu serializacji CodeDOM. (Uwaga: metoda może miećprivate
zakres). - Ta właściwość jest typem, który nie ma elementu DesignerSerializer
Jeśli te instrukcje są prawdziwe, projektant określa, czy typ tej właściwości ma konwerter typów. Jeśli tak, projektant używa konwertera typów do serializacji zawartości właściwości. W przeciwnym razie używa BinaryFormatter go do serializacji zawartości do pliku zasobu. Windows Forms Dodano analizatory wraz z poprawkami kodu, aby ułatwić uświadomienie sobie tego typu zachowania, w którym BinaryFormatter serializacja może wystąpić bez wiedzy dewelopera.
Ładowanie zasobu podczas wykonywania
Typy, które zostały wcześniej serializowane w plikach zasobów za pośrednictwem BinaryFormatter , będą nadal deserializować zgodnie z oczekiwaniami bez potrzeby BinaryFormatter , ponieważ zawartość plików ResX jest uważana za zaufane dane. W rzadkich przypadkach deserializacja nie może wystąpić bez BinaryFormatter, można ją dodać z powrotem z nieobsługiwanym pakietem zgodności. Aby uzyskać szczegółowe informacje, zobacz BinaryFormatter Przewodnik migracji: Pakiet zgodności. Należy pamiętać, że do użycia BinaryFormatter dla zasobów jest wymagany dodatkowy krok ustawiania System.Resources.Extensions.UseBinaryFormatter
przełącznika true
kontekstu aplikacji.
Generowanie plików zasobów za pośrednictwem programu msbuild
Podczas generowania plików zasobów za pośrednictwem programu msbuild może wystąpić MSB3825
błąd określający, że zasoby sformatowane binarnie mogą być deserializowane przy użyciu BinaryFormatter środowiska uruchomieniowego. Jak wspomniano powyżej, te zasoby nie będą deserializować przy użyciu i BinaryFormatter to ostrzeżenie można wyłączyć, ustawiając właściwość GenerateResourceWarnOnBinaryFormatterUse
na false
wartość . W rzadkich przypadkach deserializacji nie może wystąpić bez BinaryFormatterprogramu , można go dodać z powrotem z nieobsługiwanym pakietem zgodności. Aby uzyskać szczegółowe informacje, zobacz BinaryFormatter Przewodnik migracji: Pakiet zgodności. Należy pamiętać, że do użycia BinaryFormatter dla zasobów jest wymagany dodatkowy krok ustawiania System.Resources.Extensions.UseBinaryFormatter
przełącznika true
kontekstu aplikacji.
Migrowanie z dala od BinaryFormatter
Jeśli typy, które nie są wewnętrznie obsługiwane podczas serializacji i deserializacji, są używane w scenariuszach, których dotyczy problem, należy podjąć działania w celu ukończenia migracji do platformy .NET 9 lub nowszej wersji.
Scenariusze OLE
Aby uzyskać więcej informacji na temat migrowania z dala od scenariuszy, takich jak schowek i przeciąganie i upuszczanie, zobacz Windows Forms i Wskazówki dotyczące technologii OLE programu Windows Presentation FoundationBinaryFormatter.BinaryFormatter
Ładowanie i zapisywanie zasobów w czasie projektowania
W przypadku typów, które nie są wewnętrznie obsługiwane podczas serializacji do zasobów, takich jak w przypadku projektanta ze scenariuszami ResX, zalecanym sposobem migracji z dala od BinaryFormatter jest upewnienie TypeConverter
się, że element jest zarejestrowany dla typu lub właściwości, która uczestniczy w serializacji. W ten sposób, podczas serializacji i deserializacji, element jest używany zamiast tego, TypeConverter
gdzie BinaryFormatter był kiedyś używany. Aby uzyskać więcej informacji na temat implementowania konwertera typów, zobacz TypeConverter
Klasa.
Obejście zgodności (niezalecane)
Użytkownicy platformy .NET 9, którzy nie mogą przeprowadzić migracji, BinaryFormatter mogą zainstalować nieobsługiwany pakiet zgodności. Aby uzyskać więcej informacji, zobacz BinaryFormatter Przewodnik migracji: Pakiet zgodności.
Uwaga
BinaryFormatter jest niebezpieczne i nie jest zalecane, ponieważ naraża aplikacje na ryzyko ataków, takich jak odmowa usługi (DoS), ujawnienie informacji lub zdalne wykonywanie kodu. Aby uzyskać więcej informacji na temat czynników ryzyka BinaryFormatter , zobacz Deserializacja ryzyka w użyciu i powiązanych BinaryFormatter typów.
Problemy
Jeśli w twojej Windows Forms aplikacji wystąpi nieoczekiwane zachowanie dotyczące BinaryFormatter serializacji lub deserializacji, zgłoś problem w github.com/dotnet/winforms i wskaż, że problem jest związany z usunięciem elementu BinaryFormatter.