zmienna serialVersionUID

0

Jakich modyfikatorów należałoby użyć przy deklaracji tej zmiennej?

0

private static final - w końcu nie chciałbyś żeby ktoś zmienił jej wartość?

0

Na pewno private?
Trochę głupie te pytania ale według mnie ta zmienna jest coś podejrzana :D
Sam chyba nie potrzebuję czytać tej zmiennej.
Nie spotkałem sie zbytnio żeby była prywatna.

0

A ja nie spotkałem nieprywatnej. Ale dostęp jest w zasadzie dowolny:

access-modifier static final long = ...
0

To jeszcze mam jedno pytanie.
Czy najpierw jest sprawdzana czy istnieje np klasa X, a potem czy UID w klasie X się zgadza? Czy to ma być unikalne w pakiecie? Chodzi mi żeby nie było kolizji. Ja bym tak oznaczał wersje klas przy okazji, czyli 1,2...4,5 i dalej

0

serialVersionUID jest sprawdzane przy deserializacji. Jeżeli ta zmienna ma inną wartość w zserializowanym obiekcie, a inną w aktualnej wersji klasy (wziętej przez ClassLoadera z classpatha) to wysypie ci się deserializacja (z wyjątkiem InvalidClassException, co jest opisane np na: https://docs.oracle.com/javase/7/docs/platform/serialization/spec/exceptions.html ).

Kolizje między różnymi (w sensie pełnej nazwy, np a.b.c.NazwaX też jest różne od d.e.f.NazwaX) klasami nie są sprawdzane, bo i po co? Zwykle nie ma też sensu odczytywać serialVersionUID programowo.

serialVersionUID jest moim zdaniem głównie po to, by uniknąć przypadkowej deserializacji obiektu klasy, która wyewoluowała od momentu serializacji na tyle, że deserializacja nie ma sensu, bo np znaczenie pól się zmieniło.

Ponadto bardzo często za serialVersionUID używa się wartości losowych, zamiast kolejnych liczb naturalnych. serialVersionUID używa typu long, czyli 64-bitowych liczb, a to na tyle dużo, że kolizje są bardzo mało prawdopodobne (przy dobrym generatorze liczb pseudolosowych). Zaletą używania liczb losowych jest to, że nie trzeba się martwić np rozgałęzieniami w kodzie. Jeśli masz wiele gałęzi czy nawet całych niezależnych forków projektu to będzie problem przy używaniu kolejnych liczb naturalnych - trzeba się dogadać, by nie było kolizji. Natomiast przy użyciu liczb pseudolosowych z dobrego generatora nie trzeba się z nikim dogadywać.

Liczby losowe możesz sobie wziąć np z https://www.random.org/cgi-bin/randbyte?nbytes=8&format=h a potem usunąć spacje i przerobić na liczbę dziesiętną w taki sposób:

        long x = Long.parseUnsignedLong("b6e86253f93dfa08", 16);
        System.out.println(x);
0

I wszystko jasne, dzieki

1 użytkowników online, w tym zalogowanych: 0, gości: 1