Подтвердить что ты не робот

Почему интерфейсы не являются [Serializable]?

Я бы подумал, что добавление этого атрибута в интерфейс будет полезно, чтобы убедиться, что вы не создаете классы, которые используют интерфейс, и забудьте сделать их сериализуемыми.

Это может быть очень фундаментальный вопрос, но я хотел спросить экспертов.

4b9b3361

Ответ 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 к вашему классу, вы, скорее всего, также забыли проверить, действительно ли сериализация работает на вашем классе. Конечно, во многих случаях он будет работать "из коробки", поэтому добавление атрибута - это все, что осталось, но вы должны дважды проверить и явно подтвердить этот факт (вручную добавив атрибут).