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

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

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

30
задан Jørn Schou-Rode 14 April 2010 в 17:06
поделиться

4 ответа

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

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

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


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

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

interface MustBeSerializable : ISerializable {}

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

71
ответ дан 27 November 2019 в 23:19
поделиться

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

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

2
ответ дан 27 November 2019 в 23:19
поделиться

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

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

2
ответ дан 27 November 2019 в 23:19
поделиться

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

interface IMyInterface : ISerializable
{
    // Custom interface definition
}

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

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

4
ответ дан 27 November 2019 в 23:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: