c# - 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));
}
}
}
有没有办法在界面中指定?
解决方案
简短的回答是不,您不能通过接口强制执行属性。原则上,接口是关于契约(行为)的,而序列化是关于通常不反映在接口中的状态。
您拥有的选项是:
不要使用“可存储”对象的接口,而是使用
StorableBase
消费者代码应该继承的抽象类(如 )。这样做的主要缺点是它限制了消费者代码可以与您的库一起使用的类的类型。另请注意,并非所有序列化库在查找Serializable
属性时都会检查所有类层次结构,有些可能只检查具体类。您可以在该抽象类上实现ISerializable
接口,以更好地控制序列化过程。有关详细信息,请参见此处。Roslyn 介绍了代码分析器的概念。您可以创建一个自定义代码分析器,在编译时检查您的规则。有关更多详细信息和示例,请参见此处。
推荐阅读
- javascript - Angular - 在公共方法中调用按钮的函数
- ruby-on-rails - <%= 在rails 4中有一个块
- mpandroidchart - MPAndroid CandleStickChart 在切换到 CombinedChart 时不起作用
- android - 锚定材质浮动操作按钮
- r - R / dplyr:var1*var2 矩阵中的文本
- azure - 我们如何从 azure face api 显示带有人脸 ID 的姓名?
- javascript - 以编程方式单击 JQuery 菜单小部件
- python - 检查 pymongo 中是否存在文档
- laravel - 我该如何解决这个 php artisan 问题?Illuminate\Contracts\Container\BindingResolutionException
- node.js - axios.get 没有在 nodeJS Express 中返回任何内容