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

MPa*_*lak 1 c# xml serialization save

所以主要是我在这里寻找最佳实践.我有一个系统,它基本上是一组规则,一些数据和一个管理器,以确保数据遵循规则.很简单.我试图找出处理保存和加载规则的最佳方法.对于第一次尝试,我有一个名为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);
  }
}
Run Code Online (Sandbox Code Playgroud)

所以在这里,我将保存功能放入正在保存的类中.我即将实现一个类似的加载机制,它将采用每个元素并构建规则.在我这样做之前,我想看看是否有关于此的最佳实践.我是否应该创建一个单独的系统来接受规则,询问它,然后将其保存到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);
}
Run Code Online (Sandbox Code Playgroud)

我在这些方法之间来回不确定何时使用其中一种或者是否还有更好的解决方案.

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

ale*_*ale 6

我不认为班级本身应该知道如何序列化.这违反了单一责任原则.SoupML说,想想明天会出现一种新的令人敬畏的序列化格式.如果你让对象之外的人负责序列化,那么使用SoupML让你的系统运行起来真的很容易,你甚至不需要改变现有的规则模型.

理想情况下,只有那些明确使用XML的单元才应该知道XML,这样你的系统就可以用不关心格式但只关心接口的单元制作.稍后他们将被告知要使用哪个序列化器/解串器(控制反转).这样做也支持开闭原则.您不必撬开打开的东西进行修改,但它会打开以进行扩展.