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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

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