2011-10-12 8 views
6

gdy tworzę klasy Java w Eclipse, który implementuje Serializable interfejs, otrzymuję ostrzeżenieJak serialVersionUID oblicza

Serializable klasy ABCD nie deklaruje statycznego ostatecznej serialVersionUID pole typu długi

Po kliknięciu ostrzeżenia pojawia się opcja w środowisku Eclipse do:

Dodaj wygenerowaną wersję seryjną ID

Po wybraniu tej opcji Eclipse automatycznie tworzy dla mnie zmienną serialVersionUID.

Teraz chciałem wiedzieć, na jakiej podstawie generowany jest ten numer. To jest po prostu dowolna liczba losowa? Czy mogę podać dowolną liczbę losową?

Odpowiedz

12

Jest on obliczany na podstawie struktury twojej klasy - pól, metod itp. Jest określony w dokładnym formacie w Object Serialization Specification - see this section.

Specyfikacja opisuje, co dzieje się w przypadku braku wartości, ale autogeneracja używa tego samego algorytmu.

Kolejność elementów w strumieniu jest następujący:

  • Nazwa klasy.
  • Modyfikatory klasy zapisane jako 32-bitowa liczba całkowita.
  • Nazwa każdego interfejsu posortowana według nazwy.
  • Dla każdego pola klasy posortowanego według nazwy pola (z wyjątkiem prywatnych zmiennych statycznych i prywatnych zmiennych przejściowych: * Nazwa pola. * Zmodyfikowane pola o wartości 32-bitowej z modyfikatorem . * Deskryptor
  • Jeśli istnieje inicjator klasy, zapisz następujące informacje: * Nazwa metody,. * Modyfikator metody, java.lang.reflect.Modifier.STATIC, zapisany jako 32-bitowa liczba całkowita. * Deskryptor metody metody,() V.
  • Dla każdego nieprywatnego konstruktora posortowanego według nazwy i podpisu metody: * Nazwa metody,. * Modyfikatory metody zapisane jako 32-bitowa liczba całkowita . * Deskryptor metody.
  • Dla każdej nieprywatnej metody posortowanej według nazwy i podpisu metody: * Nazwa metody. * Modyfikatory metody zapisane w postaci 32-bitowej liczby całkowitej w postaci . * Deskryptor metody.
4

Automatycznie generowane serialVersionIds są hash na podstawie sygnatur metod, parametrów i takie jak w klasie. Robi się to w ten sposób, że serialVersionId zmieni się po każdej zmianie klasy, wskazując na mechanizm serializacji, że dane/klasa nie są już kompatybilne. To jest domyślne.

Po zdefiniowaniu własnego, zacznij od 1 i zwiększaj, gdy klasa nie jest już kompatybilna z wcześniej serializowanymi danymi.

Powiązane problemy