Подтвердить что ты не робот

Почему Java.lang.Object не реализует интерфейс Serializable?

Возможный дубликат:
Почему Java нуждается в интерфейсе Serializable?

Согласно Serializability в документах Java:

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

Почему Object уже не реализует Serializable? Члены, которых мы не хотели бы сериализовать, могут быть сделаны как transient. Зачем устанавливать стандартную сериализацию?

4b9b3361

Ответ 1

Все подтипы сериализуемого класса сами сериализуемы.

Другими словами: все классы, которые вы когда-либо создавали, были или будут созданы, могут быть сериализованы. transient исключает поля, а не целые классы.

Это потенциальная дыра в безопасности - по совпадению вы можете сериализовать, например. ваш DataSource с учетными данными базы данных внутри - если создатель этой конкретной реализации DataSource забыл сделать такие поля transient. Это удивительно легко сериализовать случайный объект Java, например. через внутренние классы, содержащие неявные ссылки на внешний this.

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

Более того, вы уже не можете сказать: MySuperSecretClass не сериализуется (просто не реализуя Serializable) - вы можете исключать только кишки (поля).

Ответ 2

1. Serializable - это интерфейс маркера, который пуст, но когда класс помечен Serializable, это означает, что его объекты являются Serializable.

2. Причина, по которой java.lang.Object не реализовал Serializable, потому что, что, если вы НЕ хотите, чтобы определенные поля были Serializable, и вы, моя ошибка, пропустили, чтобы добавить переход к этому полю, то будет хаос.

3.. Заставляя программиста реализовать Serializable для своего класса, он делает осознание среди программиста, что он сознательно реализовал его, и должен предпринять необходимый шаг, чтобы предотвратить сериализацию чего-либо, что не должно быть.

Ответ 3

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

/** DON'T SERIALIZE IT!!! */
class Connection { ... }

и лучше иметь язык или библиотеку, чем комментарии.

Ответ 4

Я думаю, что имеет смысл реализовать Serializable для объектов, которые необходимо сохранить, и объявление всех полей класса transiennt будет более громоздким. Еще один момент, который я не уверен, заключается в том, что Object - это корень всех классов, включающий классы, связанные с отражением, поэтому было бы нецелесообразно реализовывать Serializable для класса Object.