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