Java Serializable: должен ли E быть сериализуемым в ArrayList?


У меня есть следующий класс, содержащий поля, указанные ниже. Мой вопрос заключается в том, должны ли Admin, Worker и все мои другие самостоятельные классы реализовывать Сериализуемость, чтобы MyClass был Сериализуемым?

public class MyClass implements java.io.Serializable {
  private static final long serialVersionUID = 1L;
  ArrayList<Admin> admins;
  ArrayList<Worker> workers;
  ArrayList<Manager> managers;
  ArrayList<Secretary> secretaries;
  ArrayList<Category> categories;
  HashMap<Issue, HashMap<Category,Manager>> ManagedIssues;
  private static MyClass instance;
      ...
}
5 4

5 ответов:

Мой вопрос заключается в том, должны ли Admin, Worker и все мои другие самостоятельные классы реализовывать Сериализуемость для того, чтобы MyClass был Сериализуемым?

Да. Они должны быть такими.

ArrayList по умолчанию is уже реализует интерфейс Serializable. Но вам нужно реализовать сериализуемый интерфейс для типов, которые вы используете.

Сериализуемость класса обеспечивается классом, реализующим java.io.Serializable interface. Классы, которые не реализуют этот интерфейс, не будут иметь ни одного из их состояние сериализовано или десериализовано. Все подтипы сериализуемого класса сами сериализуемы.

Да.

Если вы не хотите, чтобы этот материал был сериализован, отметьте его как transient.

Как утверждали другие, если класс помечен Serializable, то все внутри должно быть помечено Serializable тоже.

Но и в этом случае вам действительно нужно убедиться, что вы ограничиваете изменчивость внутреннего состояния. Другими словами, принимая изменяемый объект (например, ArrayList) в (конструктор или сеттер) или возвращая его (в геттер), сделайте копии для защиты внутреннего состояния MyClass. Это всегда хорошая практика, но особенно с Serializable.

Если вы делаете класс сериализуемым, то вы должны убедиться, что все, что попадает в этот класс, также сериализуемо. Поэтому сначала вы должны сделать их сериализуемыми.

Да, но только если списки ТОСов / карта не пусты. В этом случае механизм сериализации попытается сериализовать содержимое коллекций.