Почему ObjectOutputStream.writeObject не принимает Сериализуемый? - PullRequest
22 голосов
/ 11 апреля 2011

Почему ObjectOutputStream.writeObject(Object o) не принимает Serializable?Почему он принимает Object?

Ответы [ 2 ]

17 голосов
/ 11 апреля 2011

Это потому, что writeObject в ObjectOutputStream переопределяет метод в ObjectOutput интерфейс , который не требует, чтобы объект был Serializable.

Интерфейс ObjectOutput определяет методы, позволяющие записывать объекты в поток или базовое хранилище, но это может быть достигнуто с помощью процесса, отличного от сериализации. ObjectOutputStream реализует эту функцию, но требует сериализуемых объектов. Однако он не может изменить сигнатуру интерфейса, который он реализует.

4 голосов
/ 19 ноября 2013

Это должно быть ObjectOutputStream.writeObject(serializable), а не ObjectOutputStream. writeObject(Object). Это правильный вариант использования, где должен использоваться интерфейс маркера, такой как Serializable, но, к сожалению, нет. Это сделало бы возможным очень реальное преимущество проверки типов во время компиляции вместо сбоя во время выполнения, если объект не реализует интерфейс Serializable.

Я хотел бы воспользоваться этой возможностью, чтобы упомянуть то, что Джошуа Блох упомянул в своей книге Эффективная Java :

Интерфейс маркера - это интерфейс, который не содержит метода декларации, но просто обозначает (или «маркирует») класс, который реализует интерфейс как имеющий некоторое свойство. Например, рассмотрим интерфейс Serializable. Реализуя этот интерфейс, класс указывает, что его экземпляры могут быть записаны в ObjectOutputStream (или «сериализовано»).

В случае интерфейса маркера Serializable метод ObjectOutputStream.write(Object) завершится ошибкой, если его аргумент не реализовать интерфейс. Необъяснимо, что авторы ObjectOutputStream API не воспользовался Serializable интерфейс в объявлении метода записи. Тип аргумента метода должно было быть Serializable, а не Object. В нынешнем виде попытка вызвать ObjectOutputStream.write для объекта, который не реализовать Serializable не удастся только во время выполнения, но он не имел быть таким.

...