Serialization
i
SerialVersionUID
zawsze 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ę
SerialVersionUID
w mojej
Serializable
klasie -?
Opró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
.
SerialVersionUID
W tym artykule poznasz nie tylko podstawy języka Java,
SerialVersionUID
ale także jego wpływ na proces serializacji i deserializacji. Kiedy deklarujesz klasę, na przykład
Serializable
poprzez 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
SerialVersionUID
nie zostanie znalezione żadne dopasowanie, proces zakończy się z wyjątkiem
InvalidClassException
w „
main
” strumieniu
java.io.InvalidClassException
, a także wydrukuje nazwę klasy i odpowiadającą jej nazwę
SerialVersionUID
. Szybkim rozwiązaniem tego problemu jest skopiowanie
SerialVersionUID
i zdefiniowanie go jako stałej typu
private
static
final
long
w klasie. W tym artykule dowiemy się, dlaczego powinniśmy używać
SerialVersionUID
w 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
SerialVersionUID
tak jak
static
final
long
w 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
SerialVersionUID
ostatecznie 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
SerialVersionUID
w
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
serialver
znajdują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ć
SerialVersionUID
dla 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
SerialVersionUID
starych 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ć
serialver
do generowania
SerialVersionUID
dla klas. Jest to szczególnie przydatne przy tworzeniu klas; narzędzie powraca
SerialVersionUID
w formacie łatwym do skopiowania. Możesz użyć
serialver
narzę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
serialver
jako
GUI
polecenia
$ 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
SerialVersionUID
i dlaczego ważne jest zadeklarowanie tego w
Serializable
klasie -, czas przejrzeć kilka ważnych faktów związanych z Java SerialVersionUID.
SerialVersionUID
używany do wskazania wersji serializowanych danych.
- Gdy nie deklarujemy
SerialVersionUID
w 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.
- 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ę.
- 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
.
- 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ę
SerialVersionUID
w Javie. Teraz wiemy, dlaczego ważne jest prawidłowe deklarowanie
SerialVersionUID
na 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
GO TO FULL VERSION