C#强制子类实现Serializable

时间:2019-04-30 07:48:29

标签: c# serialization interface

我有一个接口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 :(得分:0)

简短的回答是“否”,您不能通过接口强制执行A​​ttribute。 原则上,接口是关于契约(行为)的,而序列化是关于状态的,而状态通常不会反映在接口中。

您拥有的选项是:

  • 不是使用用于“可存储”对象的接口,而是使用消费者代码应继承的抽象类(例如StorableBase)。这样做的主要缺点是,它限制了使用者代码可以与您的库一起使用的类的类型。另请注意,在寻找Serializable属性时,并不是所有的序列化库都检查所有的类层次结构,有些可能只检查具体的类。您还可以在该抽象类上实现ISerializable接口,以更好地控制序列化过程。 See here for details.

  • Roslyn引入了代码分析器的概念。您可以创建一个自定义代码分析器,以在编译时检查您的规则。 See here for more details and an example