Подкласс C # force для реализации Serializable - PullRequest
0 голосов
/ 30 апреля 2019

У меня есть интерфейс IStorageManager, который позволяет мне хранить данные, различные реализации предназначены для хранения на основе файлов json, на основе файлов xml и т. Д.

У меня есть интерфейс IStorable, и я хочу, чтобы все классы, реализующие IStorable, имели заголовок [Serializable]. Так что в IStorageManager я могу реализовать это так:

public interface IStorageManager
{
    IStorable Load<IStorable>(string Path);
    void Save<IStorable>(IStorable objToSave, string path);
}
public class XMLStorageManager : IStorageManager
{
    public void Save<T>(T objToSave, string path)
    {
        System.Xml.Serialization.XmlSerializer serializer = new System.Xml.Serialization.XmlSerializer(typeof(T));
        using (TextWriter writer = new System.IO.StreamWriter(System.IO.Path.GetFullPath(path)))
        {
            serializer.Serialize(writer, typeof(T));
        }
    }
}

Есть ли способ указать, что в интерфейсе ??

1 Ответ

0 голосов
/ 30 апреля 2019

Короткий ответ: Нет, вы не можете применить атрибут через интерфейс.В принципе, интерфейсы - это контракты (поведение), а сериализация - о состоянии, которое обычно не отражается в интерфейсах.

Имеются следующие варианты:

  • Вместо использованияинтерфейс для «хранимых» объектов использует абстрактный класс (например, StorableBase), от которого потребительский код должен наследовать.Основным недостатком этого является то, что он ограничивает типы классов, которые потребительский код может использовать с вашей библиотекой.Также обратите внимание, что не все библиотеки сериализации проверяют всю иерархию классов при поиске атрибута Serializable, а некоторые могут проверять только конкретный класс.Кроме того, вы можете реализовать интерфейс ISerializable в этом абстрактном классе, чтобы иметь больше контроля над процессом сериализации. Подробнее см. Здесь.

  • Рослин представила концепцию анализаторов кода.Вы можете создать собственный анализатор кода, который проверяет ваше правило во время компиляции. См. Здесь для получения более подробной информации и примера .

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