首页 > 解决方案 > C# 强制子类实现 Serializable

问题描述

我有一个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));
        }
    }
}

有没有办法在界面中指定?

标签: c#serializationinterface

解决方案


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

您拥有的选项是:

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

  • Roslyn 介绍了代码分析器的概念。您可以创建一个自定义代码分析器,在编译时检查您的规则。有关更多详细信息和示例,请参见此处


推荐阅读