C# 类应该能够通过XML保存和加载自己吗?

C# 类应该能够通过XML保存和加载自己吗?,c#,xml,serialization,save,C#,Xml,Serialization,Save,所以我主要在这里寻找一个最佳实践的答案。我有一个系统,它基本上是一组规则、一些数据和一个确保数据遵循规则的管理器。很简单。我正试图找出保存和加载规则的最佳方法。第一次尝试,我有一个名为IRule的接口,所有规则都继承该接口 interface IRule { /* all rules inherit this */ string RuleName {get;} } interface IRuleTypeA : IRule { /* Type A Rules */ double[]

所以我主要在这里寻找一个最佳实践的答案。我有一个系统,它基本上是一组规则、一些数据和一个确保数据遵循规则的管理器。很简单。我正试图找出保存和加载规则的最佳方法。第一次尝试,我有一个名为IRule的接口,所有规则都继承该接口

interface IRule
{
  /* all rules inherit this */
  string RuleName {get;}
}
interface IRuleTypeA : IRule
{
  /* Type A Rules */
  double[] Data;
}

interface IRuleTypeB : IRule
{
  /* Type B Rules */
  double[,] Data;
}

public static class IRuleExtensions
{
  XElement AsXml(this IRuleTypeA ruleA)
  {
    //format my data my way and return an XElement representation
    return new XElement(...);
  }
  XElement AsXml(this IRuleTypeB ruleB)
  {
    //format my different data in a different way and return an XElement
    return new XElement(...);
  }
  XElement AsXml(this IRule rule)
  {
    object definition = null;
    if(rule is IRuleTypeA)
      definition = (rule as IRuleTypeA).AsXml();
    else if(rule is IRuleTypeB)
      definition = (rule as IRuleTypeB).AsXml();
    return new XElement("RuleDefinition", new XAttribute("name", rule.RuleName),
                         definition);
  }
}
所以在这里,我将保存功能放入正在保存的类中。我正要实现一个类似的加载机制,它将接受每个元素并构造一个规则。在我这么做之前,我想看看是否有关于这方面的最佳实践。我是否应该创建一个单独的系统,该系统将接受一条规则,对其进行查询,然后将其保存为XML,并使用工厂类型的系统来使用XML来构建对象

interface RuleToXmlAdaptor
{
  XElement AsXml(IRule rule);
  IRule FromXml(XElement element);
}
class RuleAToXmlAdaptor : RuleToXmlAdaptor
{
  XElement AsXml(IRule rule) { return AsXml(rule as IRuleTypeA); }
  XElement AsXml(IRuleTypeA rule);
}
我在这些方法之间来回奔波,不确定何时使用其中一种,或者是否还有更好的解决方案


我不想使用序列化,因为文件类型可能会不断更改,我可以通过这种方式相当简单地管理兼容性。

我认为您必须开始研究可以在类上使用的xml属性和属性,这些属性允许您轻松地将类对象序列化为xml文件并再次反序列化需要时。

我认为您必须开始研究可以在类上使用的xml属性和属性,这些属性可以让您轻松地将类对象序列化为xml文件,并在需要时再次对其进行反序列化。

我不会这样做,因为这会束缚您的手脚,尽管短期内可能会更方便。与其使用
XElement
,为什么不让界面公开
字典
。然后,您可以拥有键值对(具有众所周知的值类型,如
String
Dictionary
)。这样,单元测试将更容易,如果您选择的话,您可以使用更有效的格式

interface RuleSerializer
{
  Dictionary<string,object> AsDictionary(IRule rule);
  IRule FromDictionary(Dictionary<string,object> data);
}
接口规则序列化程序
{
字典作为字典(IRule规则);
IRule FromDictionary(字典数据);
}

我不会这样做,因为这会束缚你的双手,尽管短期内可能会更方便。与其使用
XElement
,为什么不让界面公开
字典
。然后,您可以拥有键值对(具有众所周知的值类型,如
String
Dictionary
)。这样,单元测试将更容易,如果您选择的话,您可以使用更有效的格式

interface RuleSerializer
{
  Dictionary<string,object> AsDictionary(IRule rule);
  IRule FromDictionary(Dictionary<string,object> data);
}
接口规则序列化程序
{
字典作为字典(IRule规则);
IRule FromDictionary(字典数据);
}

我认为类本身不应该知道如何序列化它。这违反了单一责任原则。想想明天会出现一种新的很棒的序列化格式,SoupML说。如果让对象之外的人负责序列化,那么使用SoupML使系统正常工作应该非常容易,甚至不必更改现有的规则模型


理想情况下,只有那些显式使用XML的单元才应该知道XML,通过这种方式,您的系统可以由不关心格式而只关心接口的单元组成。稍后,他们将被告知要使用哪个序列化程序/反序列化程序(控制反转)。这样做也支持开闭原则。您不必撬开打开的东西进行修改,但它将打开进行扩展。

我认为类本身不应该知道如何序列化它。这违反了单一责任原则。想想明天会出现一种新的很棒的序列化格式,SoupML说。如果让对象之外的人负责序列化,那么使用SoupML使系统正常工作应该非常容易,甚至不必更改现有的规则模型


理想情况下,只有那些显式使用XML的单元才应该知道XML,通过这种方式,您的系统可以由不关心格式而只关心接口的单元组成。稍后,他们将被告知要使用哪个序列化程序/反序列化程序(控制反转)。这样做也支持开闭原则。您不必撬开东西进行修改,但它将打开进行扩展。

您可以使用xml属性管理所有内容,也可以管理它们在xml文件中的外观。您可以使用xml属性管理所有内容,还可以管理它们在xml文件中的外观。+1,所有参数都正确,这甚至允许您拥有多种序列化格式。此外,您的课程将更简单,更容易理解和改进。感谢您深思熟虑的回答。您会采用适配器的方法还是类似于将Save(ISave saver){saver.Save(this);}方法添加到我的规则中?+1,所有参数都是正确的,这甚至允许您使用多种序列化格式。此外,您的课程将更简单,更容易理解和改进。感谢您深思熟虑的回答。您会采用适配器的方法还是向我的规则添加Save(ISave saver){saver.Save(this);}方法?