Чи повинні класи, які реалізують Serializable, мати конструктори без аргументів?

0
8222

Ні. Це поширена помилка. Процес десеріалізації не використовує конструктор об’єкта – об’єкт створюється без конструктора та ініціалізується за допомогою серіалізованих даних екземпляра. Єдина вимога до конструктора для класу, який реалізує Serializable полягає в тому, що перший несеріалізований суперклас у своїй ієрархії успадкування повинен мати конструктор без аргументів. (Див. http://www.jguru.com/jguru/faq/view.jsp?EID=34802 для більш повного пояснення). Це має сенс: десеріалізація повинна реконструювати весь стан об’єкта, який включає стан будь-яких суперкласів. Якщо суперклас сам по собі не можна серіалізувати, тоді десеріалізація повинна створювати екземпляр цього суперкласу з нуля – отже, ця вимога. Наприклад, з таким класом:

публічний клас MySerializableClass реалізує Serializable { ... }

ви робите НЕ потрібен конструктор без аргументів. MySerializableClass відповідає всім вимогам, оскільки його перший несеріалізований суперклас, Об'єкт, має конструктор без аргументів. У наступному прикладі:

public class MyFirstClass { } public class MySecondClass extends MyFirstClass implements Serializable { ... }

МійПершийКлас має типовий конструктор без аргументів, тому інший конструктор не потрібен. Якщо, проте, МійПершийКлас визначені конструктори, які приймають аргументи без явного оголошення конструктора без аргументів, тоді ви отримаєте NotSerializableExceptin при спробі серіалізації MySecondClass.

Всі вимоги до об'єкта, який реалізує Serializable перераховані на http://www.jguru.com/jguru/faq/view.jsp?EID=31434.