JavaRush /Blog Java /Random-PL /Po co używać SerialVersionUID w klasie Serializable w Jav...
0xFF
Poziom 9
Донецк

Po co używać SerialVersionUID w klasie Serializable w Javie

Opublikowano w grupie Random-PL
Serializationi SerialVersionUIDzawsze pozostaje tajemnicą dla wielu programistów Java. Często widzę pytania o to SerialVersionUID, co to jest lub co się stanie, jeśli nie zadeklaruję SerialVersionUIDw mojej Serializableklasie -? Po co używać SerialVersionUID w klasie Serializable w Javie - 1Oprócz tego, że jest mylące i rzadko używane, innym powodem tego pytania jest brakujące ostrzeżenie w Eclipse IDE SerialVersionUID, na przykład: „ Klient klasy Serializable nie deklaruje statycznego końcowego pola SerialVersionUIDSerializable typu long „ Customer. SerialVersionUIDW tym artykule poznasz nie tylko podstawy języka Java, SerialVersionUIDale także jego wpływ na proces serializacji i deserializacji. Kiedy deklarujesz klasę, na przykład Serializablepoprzez implementację interfejsu tokena java.io.Serializable, środowisko wykonawcze Java przechowuje instancję tej klasy na dysku przy użyciu domyślnego mechanizmu serializacji, chyba że skonfigurujesz proces tak, aby korzystał z interfejsu zewnętrznego . Podczas serializacji środowisko wykonawcze Java tworzy numer wersji klasy, aby móc ją później deserializować. W Javie ten numer wersji jest znany jako SerialVersionUID. Jeśli podczas deserializacji SerialVersionUIDnie zostanie znalezione żadne dopasowanie, proces zakończy się z wyjątkiem InvalidClassExceptionw „ main” strumieniu java.io.InvalidClassException, a także wydrukuje nazwę klasy i odpowiadającą jej nazwę SerialVersionUID. Szybkim rozwiązaniem tego problemu jest skopiowanie SerialVersionUIDi zdefiniowanie go jako stałej typu private static final longw klasie. W tym artykule dowiemy się, dlaczego powinniśmy używać SerialVersionUIDw Javie i jak używać narzędzia serialver JDK do generowania tego identyfikatora. Jeśli dopiero zaczynasz przygodę z serializacją, możesz także obejrzeć 10 najważniejszych pytań do wywiadu dotyczących serializacji języka Java, aby ocenić swoją wiedzę i znaleźć luki w zrozumieniu do dalszej lektury. Podobnie jak Concurrency(współbieżność) i Multi-threading(wielowątkowość), Serialization(serializacja) to kolejny temat, który zasługuje na kilkukrotne przeczytanie.

Po co używać SerialVersionUID w Javie

Jak powiedziałem, jeśli nie zdefiniowaliśmy wartości SerialVersionUIDtak jak static final longw naszej klasie, zrobi to za nas mechanizm serializacji. Mechanizm ten jest wrażliwy na wiele szczegółów, w tym na pola Twojej klasy, ich modyfikatory dostępu, implementowane przez nią interfejsy, a nawet różne implementacje kompilatora; wszelkie zmiany w klasie lub użycie innego kompilatora mogą dać inny wynik, który SerialVersionUIDostatecznie zatrzymaj ponowne ładowanie serializowanych danych.Poleganie na mechanizmie serializacji Java w celu wygenerowania tego identyfikatora jest ryzykowne, dlatego dobrym pomysłem jest jawne zdefiniowanie go SerialVersionUIDw klasie Serializable . Gorąco polecam przeczytanie klasyka języka Java - Joshuy Blocha „Efektywna Java”, aby zrozumieć serializację Java i problemy związane z jej niepoprawną obsługą. Nawiasem mówiąc, JDK udostępnia również narzędzie serialverznajdujące się w katalogu bin katalogu JAVA_HOME na moim komputerze C:\Program Files\Java\jdk1.6.0_26\bin\serialver.exe , za pomocą którego można wygenerować SerialVersionUIDdla starych klas. Jest to bardzo przydatne w przypadku, gdy dokonałeś zmian w klasie, które przerywają serializację, a aplikacja nie jest w stanie ponownie załadować serializowanych instancji. Możesz łatwo użyć tego narzędzia do tworzenia SerialVersionUIDstarych instancji, a następnie użyć go jawnie, deklarując pole jako private static final long SerialVersionUID . Nawiasem mówiąc, ze względów wydajności i bezpieczeństwa zdecydowanie zaleca się używanie zwykłego formatu binarnego do serializacji; ponownie w artykule „Efektywna Java” znajduje się kilka akapitów, które bardzo szczegółowo demonstrują zalety zwykłego formatu.

Jak używać narzędzia Serialver JDK do generowania SerialVersionUID

Możesz użyć serialverdo generowania SerialVersionUIDdla klas. Jest to szczególnie przydatne przy tworzeniu klas; narzędzie powraca SerialVersionUIDw formacie łatwym do skopiowania. Możesz użyć serialvernarzędzia JDK, jak pokazano w przykładzie:
$ serialver
use: serialver [-classpath classpath] [-show] [classname...]
$ serialver -classpath . Hello
Class Hello is not Serializable.
$ serialver -classpath . Hello
Hello: static final long SerialVersionUID = -4862926644813433707L;
Możesz także użyć tego narzędzia serialverjako GUIpolecenia $ serialver –show. Spowoduje to otwarcie inspektora serial version, który pobierze pełną nazwę klasy i wyświetli ją Serial version.

Streszczenie

Teraz wiemy, co to jest SerialVersionUIDi dlaczego ważne jest zadeklarowanie tego w Serializableklasie -, czas przejrzeć kilka ważnych faktów związanych z Java SerialVersionUID.
  1. SerialVersionUIDużywany do wskazania wersji serializowanych danych.

  2. Gdy nie deklarujemy SerialVersionUIDw naszej klasie, robi to za nas środowisko uruchomieniowe Java, jednak proces ten jest wrażliwy na wiele metadanych klasy, w tym liczbę pól, typ pól, modyfikatory dostępu do pól, interfejsy, które są zaimplementowane w klasie itp. Dokładne informacje można znaleźć w dokumentacji serializacji firmy Oracle.

  3. Zaleca się zadeklarowanie SerialVersionUID jako prywatnej statycznej długiej zmiennej końcowej, aby uniknąć domyślnego mechanizmu. Niektóre IDE, takie jak Eclipse , również wyświetlają ostrzeżenia, jeśli o tym zapomnisz, na przykład: „Klient klasy Serializable nie deklaruje statycznego końcowego pola SerialVersionUID typu long”. Chociaż możesz wyłączyć to ostrzeżenie, wybierając opcję Okno > Preferencje > Java > Kompilator > Błędy/ostrzeżenia > Potencjalne problemy z programowaniem, sugeruję tego nie robić. Tylko wtedy, gdy odzyskiwanie danych nie jest wymagane, mogę się tym zająć. Oto jak wygląda ten błąd w Eclipse IDE, wystarczy podjąć pierwszą szybką decyzję. Po co używać SerialVersionUID w klasie Serializable w Javie - 2

  4. Możesz także użyć narzędzia serialver z pakietu JDK, aby wygenerować wersję szeregową dla klas w Javie. Narzędzie posiada również graficzny interfejs użytkownika, który jest włączany po przekazaniu parametru - show.

  5. Najlepszą praktyką w serializacji jest jawne zadeklarowanie SerialVersionUID, aby uniknąć problemów z deserializacją, szczególnie jeśli pracujesz z aplikacją klient-serwer, która opiera się na serializowanych danych, takich jak RMI.
Wszystko dzieje się SerialVersionUIDw Javie. Teraz wiemy, dlaczego ważne jest prawidłowe deklarowanie SerialVersionUIDna zajęciach. Możesz podziękować swojemu IDE za to przypomnienie, które może potencjalnie przerwać deserializację twojej klasy. Jeśli chcesz przeczytać więcej o serializacji i pokrewnych koncepcjach, możesz także zapoznać się z tymi niesamowitymi artykułami. Oryginał tutaj
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION