У меня есть классная вещь:
public abstract class Thing {
// prevent instantiation outside package. Indeed, no Things will
// ever actually have a runtime class of Thing
Thing(){};
public static Thing create() {
return new SpecialThing1();
}
public static Thing createSpecial() {
return new SpecialThing2();
}
}
final class SpecialThing1 extends Thing {/* etc etc */}
final class SpecialThing2 extends Thing {/* etc etc */}
В основном я хочу, чтобы объекты, которые клиент в конечном итоге использует, были Serializable, и клиент знал, что они будут Serializable. Итак, какие классы должны реализовать Serializable? И какие нужны serialVersionUID?
2 ответа
Вам нужно только пометить Вещь как Serialiable
, и это будет унаследовано SpecialThing1
и SpecialThing2
. Вы не должны обязаны добавлять идентификаторы последовательных версий ни к одному из классов, но рекомендуется это сделать; таким образом вы можете управлять версиями классов между кодом клиента и сервера. См. связанный вопрос здесь а>.
По крайней мере, самый производный класс каждого экземпляра должен будет реализовать Serializable
. Базовые классы должны реализовывать Serializable
, если поля должны быть сериализованы. Возможно, вы захотите разработать последовательный формат для будущих изменений (обсуждение этого см. в разделе «Эффективная Java»).
Любой класс, реализующий Serializable
прямо или косвенно, должен определять serialVersionUID
.
(Примечание. Внешний пакет сможет создавать экземпляры вашего класса (путем десериализации — может потребоваться последовательный прокси-сервер). Может быть хорошей идеей переместить методы создания за пределы базового класса, чтобы вызвать меньше путаницы.)
Похожие вопросы
Связанные вопросы
Новые вопросы
java
Java — это высокоуровневый объектно-ориентированный язык программирования. Используйте этот тег, если у вас возникли проблемы с использованием или пониманием самого языка. Этот тег часто используется вместе с другими тегами для библиотек и/или фреймворков, используемых разработчиками Java.