Я не уверен, что я понимаю, как сериализуемый в Java работает - PullRequest
1 голос
/ 19 сентября 2011

Я понимаю, что он просто сохраняет состояние объекта, но в каких классах я должен реализовывать этот интерфейс?

Например, предположим, что у вас есть 4 класса A, B, C, D:

abstract class A { ... }
class B extends A { ... }
class C extends A { ... }

D - это класс, в котором создаются и обрабатываются объекты A и B:

class D { A a; B b; ... }

если я хочу сохранить состояние программы, должен ли я реализовывать интерфейс Serializable только в классах D и A?

Также предположим, что есть этот class E, который просто используется, чтобы помочь некоторым вычислениям в D.

Должен ли E также реализовать Serializable? мне это не кажется правильным, потому что это просто класс, который помогает с вычислениями и не хранит ничего ценного, что нужно знать в более позднем состоянии.

Ответы [ 3 ]

1 голос
/ 19 сентября 2011

Сериализуйте только те вещи, которые содержат данные, которые вам необходимо вернуть. В этом случае вероятным кандидатом является А.

Я бы не стал сериализовать D, так как это просто совокупность постоянных объектов ... Я бы позволил метод, который позволяет мне извлекать все экземпляры A и его потомков (getData ()) в массив или что-то, что позволяет хранить все Затем другой метод, который позволяет мне перестроить D с массивом A.

Кроме того, поскольку E не содержит никаких данных, его не нужно сериализовать (нет данных времени выполнения, которые необходимо сохранить).

B и C наследуют сериализуемый от A.

Просто спросите себя, если я перезапустил свое приложение, какие данные я хочу получить, когда снова включу его. Постарайтесь сделать ваши сериализованные объекты как можно более легкими, и вы упростите свою жизнь.

0 голосов
/ 19 сентября 2011

Идея сериализации заключается в том, что вы хотите заново создать экземпляр позже или на другом компьютере.Может быть, это помогает подумать о , что нам нужно создать заново, что можно создать локально.

abstract class A implements Serializable { private int a; }
abstract class B extends A { private int b; B(int b) { this.b=b;} }
abstract class C extends A { private int c; C(int c) { this.c=c;} }

Это позволяет сериализовать / десериализовать экземпляры B и C.

class D implements Serializable {
   B someB;
   C someC;
   D(int b, int c) {
     someB = new B(b);
     someC = new C(c);
   }
}

В этом случае D нужно сериализовать, потому что нам нужен экземпляр D с точно такими же объектами B и C.

Если E просто предоставляет методы, то нам может не потребоваться сериализацияэто - если D не ссылается на экземпляр E, и нам нужно, чтобы он воссоздал действительный экземпляр D.

0 голосов
/ 19 сентября 2011

Каждый объект, который вы собираетесь сериализовать, должен реализовывать интерфейс Serializable.В вашем классе A и D нужно это реализовать.Вам не нужно сериализовать E, так как у него нет состояния.

Обычно все классы, в которых хранится ваше состояние (грубо говоря, имеет переменную уровня экземпляра), должны прямо или косвенно реализовывать Serializable, если они должны быть сериализованы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...