Почему интерфейсы не [Serializable]? - PullRequest
30 голосов
/ 14 апреля 2010

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

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

Ответы [ 4 ]

71 голосов
/ 14 апреля 2010

Интерфейсы определяют контракт и не имеют собственного состояния.

Сериализация - это сохранение и загрузка состояния в объектную модель и из нее.

Нет особого смысла в сериализации чего-то, что не содержит состояния.


Чтобы ответить на практический вопрос о том, чтобы заставить реализацию интерфейса быть Serializable - вот почему ISerializable интерфейс существует.

В .NET вы можете объявить интерфейс, который должен реализовывать другие интерфейсы:

interface MustBeSerializable : ISerializable {}

См. дополнительную информацию здесь .

4 голосов
/ 14 апреля 2010

Если вы хотите, чтобы классы, реализующие ваш пользовательский интерфейс IMyInterface, были сериализуемыми, вы можете определить, что он имеет:

interface IMyInterface : ISerializable
{
    // Custom interface definition
}

Это более четко указывает на то, что реализующий класс должен поддерживать сериализацию. Это не устраняет необходимость помечать класс атрибутом [Serializable].

IIRC, вы также можете создать собственное правило FxCop, которое проверяет, что классы, наследуемые от IMyInterface, помечены соответствующим атрибутом [Serializable], и таким образом устраняется необходимость в классах для реализации пользовательской сериализации.

2 голосов
/ 14 апреля 2010

Что ж, есть причина, по которой новые классы не помечены как сериализуемые по умолчанию: добавив атрибут Serializable, вы подтверждаете, что вы гарантировали, что сериализация в вашем классе работает , выбрав правильный типы данных для полей вашего экземпляра и, если необходимо, путем добавления логики сериализации.

Итак, если вы «забыли» добавить атрибут Serializable в свой класс, вы, скорее всего, также забыли проверить, действительно ли сериализация работает в вашем классе. Конечно, во многих случаях это будет работать «из коробки», поэтому добавление атрибута - это все, что осталось, но вы должны перепроверить и явно подтвердить этот факт (добавив атрибут вручную).

2 голосов
/ 14 апреля 2010

Есть несколько хороших, хотя и эзотерических причин, объясняющих, что такое интерфейс, а что нет, что не позволяет сделать это возможным. Тем не менее, сказал: я согласен с вами. Есть много вещей, которые были бы полезны, если бы мы могли включить их в интерфейсы. [Serializable] и на ум приходят статики.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...