gpt4 book ai didi

c# - 类是否应该能够通过 XML 自行保存和加载?

转载 作者:太空宇宙 更新时间:2023-11-03 19:28:17 25 4
gpt4 key购买 nike

所以我主要在这里寻找最佳实践类型的答案。我有一个系统,基本上是一组规则、一些数据和一个确保数据符合规则的经理。很简单。我试图找出处理规则保存和加载的最佳方法。第一次尝试时,我有一个名为 IRule 的接口(interface),所有规则都继承了它。

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);
}

我在这些方法之间来回切换,不确定何时使用一种或另一种,或者是否还有更好的解决方案。

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

最佳答案

我认为类本身不应该知道如何序列化它。这违反了单一职责原则。想想明天会出现一种新的令人敬畏的序列化格式的情况,比如 SoupML。如果您让对象外部的某个人负责序列化,那么让您的系统与 SoupML 良好运行应该真的很容易,您甚至不必更改现有的规则模型。

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

关于c# - 类是否应该能够通过 XML 自行保存和加载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6917106/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com