Почему ObjectOutputStream.writeObject не принимает Serializable?
Почему ObjectOutputStream.writeObject(Object o)
не принимать Serializable
? Почему он принимает Object
?
Ответы
Ответ 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
будет терпеть неудачу только во время выполнения, но у нее не было таким образом.