/ / Попаднах на следващия параграф в текстовата книга на Java за сериализиране / десериализиране на обекти, намирам го за грешно, нали? - Java, сериализация

Намерих следния параграф в java книга за сериализиране / десериализиране на обекти, намирам за грешно, нали? - java, сериализация

Текстът е както следва:

Ако обектът има несериализиращ класнякъде нагоре наследствено дърво, конструктор за този несериализиращ се клас ще се изпълнява заедно с всички конструктори над това (дори ако те са Serializable). След като конструирането се започне, не можете да спрете това, което означава всички суперкласове, започвайки с първата несериализиращ се, ще реинициализира тяхното състояние.

Моят въпрос е дали даден клас не може да се сериализира,как може някой от неговите суперкласове да бъде сериализируем (това е, което те предполагат, когато казват "дори ако те са" сериализуеми "), защото ако те са сериализирани, тогава въпросният подклас" не-сериализуем "също трябва да може да се сериализира.

Отговори:

1 за отговор № 1

Това "е вярно," (дори ако те се "сериализира") е объркващо. Тъй като правилно тълкувате нещата, сериализуемостта се декларира от implements Serializable който се наследява точно като всеки друг interface, Следователно a Serializable класът не може да имаSerializable подклас, поне от дефиницията на интерфейсите. Следователно, "с всички конструктори над това." (дори ако те се сериализират)" няма смисъл.

Подклас на a Serializable все още може да предотврати сериализацията, като прекъсва нещата по време на изпълнение по няколко начина, но това не ги прави Serializable съгласно техническата дефиниция на. \ t Serializable.


0 за отговор № 2

ако те са сериализирани, тогава въпросният подклас, който не може да се сериализира, също трябва да може да се сериализира.

Не, това е погрешно. Можете да напишете нещо подобно:

class A implements Serializable {
...
}
class B extends A {
private Object o;
//voila! non-serializable class

}

Не можете да добавяте несериализиращо поле към клас без да прекъсвате сериализацията. Ако се опитате да сериализирате / десериализирате B ще получите NotSerializableException.