C# 类应该能够通过XML保存和加载自己吗?
所以我主要在这里寻找一个最佳实践的答案。我有一个系统,它基本上是一组规则、一些数据和一个确保数据遵循规则的管理器。很简单。我正试图找出保存和加载规则的最佳方法。第一次尝试,我有一个名为IRule的接口,所有规则都继承该接口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[]
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);}方法?