Почему интерфейсы не являются [Serializable]?
Я бы подумал, что добавление этого атрибута в интерфейс будет полезно, чтобы убедиться, что вы не создаете классы, которые используют интерфейс, и забудьте сделать их сериализуемыми.
Это может быть очень фундаментальный вопрос, но я хотел спросить экспертов.
Ответы
Ответ 1
Интерфейсы определяют контракт и не имеют собственного состояния.
Сериализация - это сохранение и загрузка состояния в объектную модель и из нее.
Не так много смысла для сериализации того, что не содержит состояний.
Чтобы ответить на практический вопрос о принуждении реализации интерфейса к Serializable
- вот почему существует ISerializable
интерфейс.
В .NET вы можете объявить интерфейс, который должен реализовывать другие интерфейсы:
interface MustBeSerializable : ISerializable {}
См. дополнительную информацию здесь.
Ответ 2
Если вы хотите заставить классы, которые реализуют ваш настраиваемый интерфейс IMyInterface
для сериализации, вы можете определить, что он имеет:
interface IMyInterface : ISerializable
{
// Custom interface definition
}
Это более четко указывает, что класс реализации должен поддерживать сериализацию. Это не устраняет необходимость отмечать класс атрибутом [Serializable]
.
IIRC, вы также можете создать собственное правило FxCop, которое проверяет, что классы, наследующие от IMyInterface
, помечены соответствующим атрибутом [Serializable]
, и таким образом устранение необходимости использования классами пользовательской сериализации.
Ответ 3
Есть некоторые хорошие, хотя и эзотерические причины того, что такое интерфейс, и который не позволяет избежать этого. Тем не менее, я согласен с вами. Есть много вещей, которые были бы полезны, если бы мы могли включить их в интерфейсы. [Serializable]
и статика приходит на ум.
Хотя они не вписываются в философию интерфейса, они, похоже, включают эту свободную серое пространство в ООП с одним наследованием. Конечно, они работают вокруг, но они чувствуют себя очень вынужденными по сравнению с первоначальными намерениями.
Ответ 4
Ну, есть причина, по которой новые классы не помечаются как сериализуемые по умолчанию: добавив атрибут Serializable
, вы подтверждаете, что вы обеспечили, чтобы сериализация в вашем классе работала путем выбора правильных типов данных для ваших полей экземпляра и путем добавления логики сериализации, если это необходимо.
Итак, если вы "забыли" добавить атрибут Serializable
к вашему классу, вы, скорее всего, также забыли проверить, действительно ли сериализация работает на вашем классе. Конечно, во многих случаях он будет работать "из коробки", поэтому добавление атрибута - это все, что осталось, но вы должны дважды проверить и явно подтвердить этот факт (вручную добавив атрибут).