2013-05-08 11 views
6

Moja podklasa implementuje Serializable, ale moja nadklasa tego nie robi.Czy serializacja będzie zapisywać pola nadklasy?

Zarówno podklasa, jak i superklasa zawierają zmienne, które należy zapisać jako część stanu podklasy.

Czy serializacja spowoduje zapisanie pól nadklasy?

+0

http://stackoverflow.com/questions/8632148/java-object-serialization-and-inheritance –

Odpowiedz

3

Jeśli nadklasa nie jest Serializable pola nie będą serializowane. Co więcej, musisz mieć konstruktor no-args w superklasie.

jako dokumentacja mówi:

Podczas deserializacji, pola klas non-serializować zostanie zainicjowany za pomocą publicznych lub zabezpieczone nie-Arg konstruktor klasy. Konstruktor no-arg musi być dostępny dla podklasy nadającej się do serializacji.

+0

Skąd mam wiedzieć, czy nadklasą jest lub nie jest 'Serializable'? – Danijel

+0

Możesz sprawdzić, jakie interfejsy implementuje. –

+0

lub możesz sprawdzić używając operatora instanceof – Amol

19

nadklasą pola nie mogą być szeregowane, jeśli nie jest Serializable.Here jest podsumowaniem niektórych zasad serializacji Java:

  • Obiekt jest serializacji tylko wtedy, gdy jego klasa lub jej nadklasą realizuje Serializable (lub Externalizable) interfejs.

  • Obiekt jest możliwy do serializacji (sam implementuje interfejs Serializable), nawet jeśli jego nadklasa nie jest. Jednak pierwsza klasa w hierarchii klasy serializowalnej, która nie implementuje interfejsu Serializable, MUSI mieć konstruktor no-arg. Jeśli zostanie naruszone, readObject() wygeneruje java.io.InvalidClassException w środowisku wykonawczym.

  • Bezargumentowy contructor każdej nieklasyfikowanej superklasy będzie działał, gdy obiekt będzie deserializowany. Jednak deserializowane obiekty? konstruktor nie działa, gdy jest deserialized.

  • Klasa musi być widoczna w momencie serializacji.

  • Wszystkie typy pierwotne można przekształcać do postaci szeregowej.

  • Pola przejściowe (z modyfikatorem przejściowym) NIE są serializowane (tzn. Nie są zapisywane ani odtwarzane). Klasa implementująca pola znaczników tranzytowych Serializablemust -transient klas, które nie obsługują serializacji (np. Strumień plików).

  • Pola statyczne (z modyfikatorem statycznym) nie są przekształcane do postaci szeregowej.

  • Jeśli zmienne członkowskie odnoszą się do obiektu podlegającego serializacji do obiektu nie nadającego się do serializacji, kod zostanie skompilowany, ale zostanie zgłoszony wyjątek RumtimeException.

+0

Bardzo przydatne, dziękuję. – Danijel

+4

Proszę podać źródło, jeśli skopiujesz i wkleisz rozwiązanie (dla wszystkich zainteresowanych osób: http://www.xyzws.com/Javafaq/what-are-rules-of-serialization-in-java/208) –

Powiązane problemy