У меня есть классная вещь:

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?

0
looeeese 26 Июн 2009 в 19:10

2 ответа

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

1
Community 23 Май 2017 в 13:33

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

Любой класс, реализующий Serializable прямо или косвенно, должен определять serialVersionUID.

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

0
Tom Hawtin - tackline 26 Июн 2009 в 19:13