C# 加载/保存接口列表

C# 加载/保存接口列表,c#,interface,save,load,C#,Interface,Save,Load,在我的应用程序中,我使用一个对象列表来实现我的ISorter接口,并公开一个方法void Sort(MyClass MyClass) 到目前为止,我在我的应用程序的入口点用一组硬编码的ISorter实现创建了这个列表。现在我已经到了我希望能够保存并从文件中加载此列表的位置 我希望格式是XML,以便可以手动编辑,但我发现.NETXMLSerializer类无法序列化接口。如果我用适当的属性标记基类,它可以序列化基类列表: [System.Xml.Serialization.XmlInclude(t

在我的应用程序中,我使用一个对象列表来实现我的ISorter接口,并公开一个方法void Sort(MyClass MyClass)

到目前为止,我在我的应用程序的入口点用一组硬编码的ISorter实现创建了这个列表。现在我已经到了我希望能够保存并从文件中加载此列表的位置

我希望格式是XML,以便可以手动编辑,但我发现.NETXMLSerializer类无法序列化接口。如果我用适当的属性标记基类,它可以序列化基类列表:

[System.Xml.Serialization.XmlInclude(typeof(MyClassA))]
[System.Xml.Serialization.XmlInclude(typeof(MyClassB))]
class MyBaseClass
我不喜欢这一点,因为当我以后可能希望用不同的存储方法替换xml序列化时,它会使我的类与xml特定的属性混杂在一起

  • 将我的ISort接口替换为SortBase基类以促进序列化有什么不利之处?在这里使用接口一开始就错了吗?我应该保留接口,但使用一个SortBase类来实现它吗?我的所有其他类都是从这个类派生的

  • 如何对存储进行抽象,以便以后可以更改存储实现,并避免用xml属性装饰类

  • 有关数据存储/加载最佳实践的任何其他信息都会有所帮助

  • 编辑:其思想是用户可以创建一个文本文件(首选atm XML),指定可以加载并应用于数据集的排序操作

    编辑2:我简化了这种情况

    class Foo{
       List<ISorter> MySorters
    }
    
    interface ISorter{
       void Sort(MyClass myClass)
    }
    
    class SortByColor : ISorter{
       public string SomeColorProperty{get;set;}
       void Sort(MyClass myClass)
    }
    
    class SortByName: ISorter{
       public string SomeNameProperty{get;set;}
       void Sort(MyClass myClass)
    }
    
    class-Foo{
    列出我的排序器
    }
    接口转换器{
    无效排序(MyClass MyClass)
    }
    类别SortByColor:ISorter{
    公共字符串SomeColorProperty{get;set;}
    无效排序(MyClass MyClass)
    }
    类SortByName:ISorter{
    公共字符串SomeNameProperty{get;set;}
    无效排序(MyClass MyClass)
    }
    
    我想将我的列表传递给某个存储/加载方法,该方法可以从某个底层数据源(例如XML文件)创建/加载列表

    编辑3:
    我可能最终会使用DataContractserializerXMLSerializer,因为这解决了我的问题,只要我提供一个公共基类。我原以为会有一种更优雅的方式来处理这个问题,而不会用属性污染我的对象

    如何将其存储为Json格式并使用JsonSerializer?这有点离题,但听起来你正在尝试“依赖注入容器”为你做的工作。您是否研究过这样的问题?当您“反序列化”一个接口时,您希望它创建一个实例的类是什么?您似乎想要序列化一组实现接口的类。我是说,你有多少接口?你提到一个。你打算反序列化“ISorter,ISorter,ISorter,ISorter,ISorter和ISorter”吗?在任何情况下,用基类替换接口都是愚蠢的。不过,为实现编写基类可能很方便。@MatthewWatson即使我使用DI,我仍然需要某种不同存储方法可以使用的接口implement@ClaudeHasler“…通过xml文件创建一组排序操作…”——这是一个很酷的想法。我希望你在问题中提到这一点。如果你想谈论不可知论,我会写一个排序描述格式,对实现它的底层类和接口是相当不可知的。我会发布API,让人们用自己的类来扩展它,但我会把它与排序定义文件分开。