2012-08-09 13 views
5

Mam następujący podpis klasy i ClientEventSourc realizuje Serializable:Zrozumienie FindBugs ostrzeżenie o polu serialVersionUID

public class Grid extends ClientEventSource implements Focusable, FramingBlockWrapper,LIMSEditableField 

Teraz FindBugs wystawiasz to za sprytny:

Klasa jest Serializable, ale nie definiuje serialVersionUID

Ta klasa implementuje Serializowalny interfejs, ale nie definiuje pola serialVersionUID. Zmiana tak prosta, jak dodanie odwołania do obiektu a .class spowoduje dodanie do klasy pól syntetycznych, które zmienią niestety domyślny identyfikator serialVersionUID (np. Dodanie odwołania do klasy String.class spowoduje wygenerowanie pola statycznego klasa $ java $ lang $ String). Ponadto różne kompilatory kodu źródłowego do kodu bajtowego mogą wykorzystywać różne konwencje nazewnictwa dla zmiennych syntetycznych generowanych dla odwołań do obiektów klas lub klas wewnętrznych. Aby zapewnić zgodność operacyjną Serializable w różnych wersjach, należy rozważyć dodanie jawnego identyfikatora serialVersionUID z .

Czy ktoś może wyjaśnić, co to oznacza i jaki jest najlepszy sposób, aby to naprawić?

Odpowiedz

7

identyfikator serialVersionUID służy do deserializacji klasy. jest generowany automatycznie domyślnie.
ale zmiana niczego w klasie generuje inny serialVersionUID i nie można deserializować "starych" obiektów.
, więc należy zdefiniować własny serialVersionUID, aby pomóc deserialisation znaleźć odpowiednią klasę.

dodać zmienną jak to w kodzie:

private static final long serialVersionUID = 6106269076155338045L; 

odsyłające na generowania UID:

Does it matter what I choose for serialVersionUID when extending Serializable classes in Java?

+0

Czy istnieje algorytm/program generujący ten numer? Chodzi mi o to, czy może to być cokolwiek, czy musi przestrzegać pewnych najlepszych praktyk, jak to robi hashcode(), jak opisano w książce Effective java i zaimplementowane w EqualsBuilder i HashCodeBuilder ze wspólników Apache. – Geek

+0

Ta liczba może być dowolna, o ile jest unikalna wśród klas zserializowanych. Eclipse f.e. ma swój własny generator, ale możesz użyć dowolnej liczby. – Kostronor

2

Może trochę wyjaśnić, co to znaczy

Niewielkie zmiany w klasie powodują zmianę serialVersionUID, której nie chcesz, ponieważ może to zapobiec deserializacji bez ważnego powodu.

i jaki jest najlepszy sposób, aby to naprawić?

Ustaw go zgodnie z sugestią.

private static final long serialVersionUID = 1; 

jest jakiś algorytm/program, który generuje ten numer

Tak. Jest to algorytm, który próbujesz ominąć, a nie odtwarzać. Zacznij od 1.

Znaczy to może być cokolwiek, albo musi przestrzegać pewnych najlepszych praktyk

Sugerowałbym użyciu 1 jest najlepsza praktyka, ponieważ sprawia, że ​​jasne było to nadpisane wartość dowolnie wybrany. Używanie dużej wartości, takiej jak 6106269076155338045L, może wyglądać jak wygenerowana liczba lub wybrać ten numer.

+0

Czy to dobry wybór? Czy możesz odpowiedzieć na mój komentarz do odpowiedzi Kostronora? – Geek

+0

Wybór wartości nie ma znaczenia. Powinieneś to zmienić za każdym razem, gdy dokonujesz zmiany. tj. za każdym razem, gdy wprowadzasz zmianę, gdy nie chcesz, aby inne wersje deserializowały się w tej wersji. Z mojego doświadczenia wynika, że ​​prawie nigdy. ;) –

1

Ta wartość jest używana przy deserializacji. Jego celem jest utrzymanie zgodności między klasami i ich odpowiednimi serializowanymi obiektami. Jeśli serializuje się obiekt typu A, a następnie zmienia się w jakiś sposób A, wówczas ten mechanizm zapobiega deserializacji obiektu; obiekt i jego klasa nie pasują do siebie i pojawią się błędy środowiska wykonawczego. W zestawie JDK znajduje się serialver.exe. Jeśli podasz mu plik .class jako parametr, wypluje on serialVersionUID. Większość IDE mają tę funkcjonalność wbudowany

Przykład wejścia.

> serialver MyClass 

(istnieje już plik MyClass.class i MyClass musi implementować Serializable)

Przykład wyjścia:

> MyClass: static final long serialVersionUID = -8174364448753809256L; 

Jeśli nie znosisz robienia rzeczy w linii poleceń, a następnie wykonywanie programu w ten sposób:

> serialver -show 

wyświetli ten GUI:

serialver screenshot

Następnie można wpisać nazwę klasa i kliknij "Pokaż".

Polecam przeczytać o procesie serializacji, jeśli Cię interesuje. Dowiesz się dokładnie, dlaczego ten identyfikator wersji jest potrzebny, jakie pola/metody są brane pod uwagę podczas generowania i wiele więcej.

+0

wiesz, jak to zrobić w Intellij Idea? – Geek

+0

@Geek Nie, przepraszam. Używałem tego IDE tylko przez kilka godzin ... Wiem, jak to zrobić w Eclipse i Netbeans. –

Powiązane problemy