2012-04-30 11 views
11

Czy istnieje jakiś sposób generowania seryjnego ServerEersionUID w środowisku Eclipse? Serialowo chcę powiedzieć, że jeśli jedna serializowalna klasa ma serialVersionUID = 1L, wtedy kiedy generuję serialVersionUID innej klasy, będzie to serialVersionUID = 2L.Informacje o wygenerowanym identyfikatorze serialVersionUID w Eclipse

Jeśli ręcznie określę 1L, 2L, 3L itd., Czy może to spowodować problemy?

Eclipse dał opcję wyboru "Dodaj wygenerowany identyfikator wersji seryjnej", czy ta opcja jest bezpieczna do wyboru?

+1

Dlaczego chcesz, aby * różne * klasy miały seryjny identyfikator seryjny? –

+0

To mój styl programowania generuje seryjnie serialServicesUID. –

+2

To jeden popularny styl w wersjach jednej klasy. Czy Twój styl w wielu klasach ma tę zaletę? Czy chcesz później zmienić wersję danej klasy, do czego służy serialVersionUID tej klasy i co się dzieje z serią relacji między klasami? –

Odpowiedz

17

nie, to nie stworzy żadnego problemu w żadnym z dwóch okoliczności:

  • można ręcznie określić ją stopniowo
  • można pozwolić Eclipse przypisać je losowo generowanych wartości
  • można zachować je wszystkie 1L dla różnych klas

Celem UID szeregowego jest zabronić serializacji i deserializacji te same klasy w różnych wersjach, szczególnie gdy nie ma kompatybilności do przodu (np. nowa wersja klasy nie może być serializowana/niezsrializowana według wcześniejszej definicji).

Jest to okoliczność, która zdarza się bardzo rzadko, szczególnie podczas pracy z własnym projektem, który nie jest częścią dużych frameworków bazujących na serializacji. Więc możesz bezpiecznie robić, co chcesz.

Sytuacja, w której chcesz mieć różne serie dla tej samej klasy, to sytuacja, w której aktualizujesz klasę i chcesz zabronić serializacji jej poprzednią deklaracją klasy SAME.

+2

Co z '@SuppressWarnings (" serial ")'? Jak to by zmieniło rzeczy? Zalecane, niezalecane? Uniknąć? – ADTC

+2

@ADTC działa, ale podlega niekompatybilności z kompilatorem. Zobacz Serializable interface. Z wersji Java 7: "Jeśli klasa nadająca się do serializacji nie deklaruje jawnie identyfikatora serialVersionUID, to środowisko wykonawcze do szeregowania obliczy domyślną wartość parametru serialVersionUID dla tej klasy na podstawie różnych aspektów klasy, zgodnie z opisem w specyfikacji Java Serialization Object Serialization. Jednak [...] może się różnić w zależności od implementacji kompilatora, a zatem może spowodować nieoczekiwane " – Kissaki

2

Pozwól mi odpowiedzieć na Twoje pytania tyłu:

dodawania generowane wersja seryjny ID ... czy to jest bezpieczne? Odpowiedź: Tak

Jeśli ręcznie określić 1L, 2L, 3L, że problem: Nie większy problem niż czyniąc je wszystkie 1 lub inny numer

generowanie identyfikatorów seryjnych seryjnie: Odpowiedź jest nie ma wbudowany mechanizm do tego. Fakt, że zadajesz to pytanie, pozwala mi wierzyć, że nie wiesz, do czego służy serialVersionUID. Nawet jeśli już przeczytałeś o tym, co to robi, powinieneś przeczytać to jeszcze raz.

+0

Dzięki za odpowiedź. Tak, wiem, dlaczego użyto sserialVersionUID, ale moim stylem programowania jest generowanie ich seryjnie w projekcie w środowisku Eclipse. –

2

Nie powinieneś tego robić w ogóle. Chodzi o to, aby zachować stałą wartość tak długo, jak to możliwe podczas ewolucji klasy, przestrzegając reguł w sekcji Określanie wersji obiektu w specyfikacji Serializacja obiektów.

Twój "styl programowania" nie ma z tym nic wspólnego. Jest to kwestia użycia tego przedmiotu w celu, dla którego został zaprojektowany. Nie jest przeznaczony do celu, w którym go używasz. Systemy kontroli kodu źródłowego mogą to dla ciebie zrobić.

+0

Jeśli chcesz, aby twoja klasa była przydatna przez długi czas, powinieneś dokonać tylko "zgodnych zmian", z których wszystkie są zdefiniowane w Specyfikacji Serializacji Obiektów, o której wspomina @EJP, tutaj. –

Powiązane problemy