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