Это должно быть ObjectOutputStream.writeObject(serializable)
, а не ObjectOutputStream. writeObject(Object)
. Это правильный вариант использования, где должен использоваться интерфейс маркера, такой как Serializable
, но, к сожалению, нет. Это сделало бы возможным очень реальное преимущество проверки типов во время компиляции вместо сбоя во время выполнения, если объект не реализует интерфейс Serializable
.
Я хотел бы воспользоваться этой возможностью, чтобы упомянуть то, что Джошуа Блох упомянул в своей книге Эффективная Java :
Интерфейс маркера - это интерфейс, который не содержит метода
декларации, но просто обозначает (или «маркирует») класс, который
реализует интерфейс как имеющий некоторое свойство. Например,
рассмотрим интерфейс Serializable. Реализуя этот интерфейс,
класс указывает, что его экземпляры могут быть записаны в
ObjectOutputStream
(или «сериализовано»).
В случае интерфейса маркера Serializable
метод ObjectOutputStream.write(Object)
завершится ошибкой, если его аргумент не
реализовать интерфейс. Необъяснимо, что авторы
ObjectOutputStream
API не воспользовался Serializable
интерфейс в объявлении метода записи. Тип аргумента метода
должно было быть Serializable
, а не Object
. В нынешнем виде
попытка вызвать ObjectOutputStream.write
для объекта, который не
реализовать Serializable
не удастся только во время выполнения, но он не имел
быть таким.