Обеспечение сериализации из интерфейса без принудительной сериализации классов в C#

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

public interface IMyInterface
{
    MethodA;
    MethodB;
}

Кроме того, я хотел бы, чтобы все классы, реализующие этот интерфейс, были сериализуемыми. Если я изменю определение интерфейса для реализации ISerializable, как показано ниже ...:

public interface IMyInterface : ISerializable
{
    MethodA;
    MethodB;
}

... все классы теперь должны явно реализовывать сериализацию, насколько мне известно, поскольку, если вы реализуете ISerializable, вы должны реализовать член GetObjectData (и необходимый конструктор для десериализации).

Как я могу настоять на том, чтобы классы, использующие мой интерфейс, были сериализуемыми, но не заставляя их настраивать сериализацию?

Спасибо, Воля

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
12
0
5 632
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Вы можете написать собственное правило FxCop и проверять по нему проверки.

Если вы хотите использовать сериализацию по умолчанию, вам необходимо добавить SerializableAttribute. Альтернативой может быть использование абстрактного класса вместо интерфейса, а затем добавление атрибута SerializableAttribute к абстрактному классу. Если вы реализуете свою собственную сериализацию, тогда вы хотите реализовать ISerializable, в противном случае придерживайтесь SerializableAttribute.

Ответ принят как подходящий

Спасибо за ответы. Было бы неплохо иметь возможность заставить классы, производные от интерфейса, реализовать сериализацию без этого, а затем заставить их настраивать сериализацию, но это кажется невозможным.

Кажется, нет способа сделать это, но я бы хотел, чтобы это было.

Однако обратите внимание на две вещи:

  • Атрибут Serializable не может быть унаследован от базового класса, даже если базовый класс отмечен как Аннотация.

  • Ты технически не нужен Сериализуемый атрибут, IF ты используя XmlSerializer потому что это не использует графы объектов.

Напишите класс, реализующий ISerializationSurrogate, и используйте его для сериализации классов, которые не сериализуемы или в которых вы не уверены в реализации сериализации.

Другие вопросы по теме