2009-06-26 3 views
0

У меня есть классная вещь:Что должно быть Serializable в этой ситуации Java?

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? И кому нужны идентификаторы serialVersionUID?

ответ

0

По крайней мере, самый производный класс каждого экземпляра должен будет реализовать Serializable. Базовые классы должны реализовывать Serializable, если поля должны быть сериализованы. Вы можете захотеть создать серийный формат для будущих изменений (см. «Эффективная Java» для некоторого обсуждения),

Всегда класс, который реализует Serializable, должен прямо или косвенно определять serialVersionUID.

(Примечание: внешний пакет будет способен создавать экземпляры вашего класса (путем десериализации - последовательный прокси может быть в порядке). Может быть хорошей идеей переместить методы создания вне базового класса, чтобы вызвать меньше путаница.)

1

Вам нужно только отметить Thing как Serialiable, и это будет унаследовано SpecialThing1 и SpecialThing2. У вас не есть, чтобы добавить UID последовательной версии в любой из классов, но это рекомендуется делать; таким образом вы можете управлять версиями классов между клиентским и серверным кодом. См. соответствующий вопрос here.

Смежные вопросы