2013-02-20 14 views
11

EDYTOWANIE: Przez przypadek mam na myśli dużą liczbę obliczeniową bez semantycznego znaczenia dla nas jako programistówDlaczego warto korzystać z liczb losowych dla wersji seryjnej UID?

Podczas implementacji interfejsu Serializable jego najlepsza praktyka i bardzo ważne jest podanie numeru seryjnego UID. W wielu miejscach często używam liczb losowych. Na przykład.

Efektywna Java (2nd edition) pg 312:

private static final long serialVersionUID = 234098243823485285L; 

Od klasy String w Javie 6:

private static final long serialVersionUID = -6849794470754667710L; 

z klasy ArrayList w Javie 6:

private static final long serialVersionUID = 8683452581122892189L; 

itp. Nawet zaćmienie oferuje opcję generowania tych liczb losowych (chociaż domyślnie domyślnie generowane jest serialVersionUI D z 1L)

Dlaczego warto używać liczb losowych? Czy nie ma sensu zaczynać od 1L i zwiększać do 2L, gdy zmienia się jak każda sensowna kontrola wersji? Jedyny przypadek, w którym mogę pomyśleć o użyciu pozornie losowej liczby, to jeśli nie określiłeś początkowego numeru seryjnego i chciałbyś to zrobić teraz (który wiąże Cię z autogenerowaną wersją czasu wykonywania w celu zapewnienia zgodności wstecznej).

+1

Nie sądzę, że są to liczby "losowe", po prostu wydają się arbitralne. To prawdopodobnie jakiś skrót członków/metod w klasie. W sumie jednak. Nie mam żadnych informacji na poparcie tego stwierdzenia. –

+0

@ JonathanNewmuis Jest on obliczany na podstawie sygnatur metod i takich. – JustinKSU

+0

Masz rację, ponieważ są one wartościami obliczonymi, ale ponieważ nie mają dla nas znaczenia, są efektywnie losowe –

Odpowiedz

10

tych „przypadkowych” numery są prawdopodobnie numery które byłoby zostały wygenerowane dla klasy automatycznie w „bieżącym” formie jak na Java Object Serialization Specification ... gdzie „prąd” jest „obecny w momencie serialVersionUID był pierwszy zdeklarowany".

Pozwoliłoby to, aby dane, które były wcześniej serializowane, nadal były przekształcone w postaci szeregowej - jednocześnie przechodząc do bardziej jednoznacznej deklaracji przełamania zmian w przyszłości.

+0

Stackoverflow Legend^ – Shivam

3

Są prawie na pewno nie liczb losowych, ale raczej dane wyjściowe narzędzia serialver.

+1

Dzięki i rozumiem to, ale zobaczenie tych liczb w kodzie sprawia, że ​​zastanawiam się, czy wszystkie te klasy zapomniały określić serialVersionUID w pierwszej instancji i są do nich doposażane, lub wybrały wyliczone wartości (z szeregowego) na początku (a jeśli tak, to dlaczego) –

+2

@ChrisKnight Cóż, nie ma sposobu, by wiedzieć, prawda? Domyślam się, że jest # 2, zwłaszcza że kod został napisany prawdopodobnie przez pisarzy technicznych i nadal nie jest to dobrze rozumiany temat nawet przez programistów nawet po 17 latach. Zwykle używam 1L lub -1L i pozostawiam to na zawsze. – EJP

Powiązane problemy