Почему 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)завершится с ошибкой, если его аргумент не реализовать интерфейс. Необъяснимо, что авторыObjectOutputStreamAPI не использовалSerializableинтерфейс в объявлении метода записи. Тип аргумента методов должен бытьSerializable, а неObject. В его нынешнем виде попытайтесь вызватьObjectOutputStream.writeна объект, который doesnt реализацияSerializableбудет терпеть неудачу только во время выполнения, но у нее не было таким образом.