Udostępnij za pośrednictwem


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.

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 zwraca false 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 falsewartość . 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.

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.