C# 用C将xml反序列化为超类对象#
我正在创建一个程序,允许用户定义公式,使用XML进行4种基本操作:加、减、除、乘。让我们举一个例子:用户想要定义像C# 用C将xml反序列化为超类对象#,c#,xml-deserialization,C#,Xml Deserialization,我正在创建一个程序,允许用户定义公式,使用XML进行4种基本操作:加、减、除、乘。让我们举一个例子:用户想要定义像(a+b)x(c+d)这样的公式。xml的格式如下所示: 编辑我必须实现这一点 编辑求解。非常感谢亚尼夫的建议。我的解决办法如下: 1. 2. 3. 4. 班级 //根元素 公共类xPlugins { [XmlElement(“xPlugin”,typeof(xPlugin))] 公共xPlugin[]插件{get;set;} } 公共类xPlugin { [XmlElement
(a+b)x(c+d)
这样的公式。xml的格式如下所示:
编辑我必须实现这一点
编辑求解。非常感谢亚尼夫的建议。我的解决办法如下:
1.
2.
3.
4.
班级
//根元素
公共类xPlugins
{
[XmlElement(“xPlugin”,typeof(xPlugin))]
公共xPlugin[]插件{get;set;}
}
公共类xPlugin
{
[XmlElement(“多个”,typeof(多个))]
[XmlElement(“添加”,类型(添加))]
[XmlElement(“减法”,typeof(除法))]
[XmlElement(“Divide”,typeof(Divide))]
[XmlElement(“运算符”,类型(操作数))]
公共计算器{get;set;}
}
//解除最后性
静态类readXML
{
公共静态void getObject(参考xPlugins插件)
{
尝试
{
列表类型=新列表();
type.Add(typeof(Add));
类型。添加(类型(减));
类型。添加(类型(多个));
加(减)字;
类型.添加(类型(运算符));
XmlSerializer xml=新的XmlSerializer(typeof(xPlugin),type.ToArray();
FileStream fs=newfilestream(“test.xml”,FileMode.Open);
plugins=(xPlugins)xml.Deserialize(fs);
}
捕获(例外情况除外)
{
投掷;
}
}
}
公共抽象类计算器
{
[XmlElement(“多个”,typeof(多个))]
[XmlElement(“添加”,类型(添加))]
[XmlElement(“Subtract”,typeof(Subtract))]
[XmlElement(“Divide”,typeof(Divide))]
[XmlElement(“运算符”,类型(操作数))]
公共列表计算器{get;set;}
公共虚拟整数计算()
{
返回0;
}
}
公共类运算符:计算器
{
公共int值{get;set;}
公共运算符(){}
公共覆盖int计算()
{
返回值;
}
}
公共类添加:计算器
{
公共添加(){}
公共覆盖int计算()
{
列表值=新列表();
foreach(计算器中的计算器)
{
value.Add(calculator.Calculate());
}
返回值。Sum();
}
}
公共类:计算器
{
公共负(){}
公共覆盖int计算()
{
int value=计算器[0]。计算();
for(int i=1;i
我只需要用以下物品装饰计算器属性:
[XmlElement("Multiple", typeof(Multiple))]
[XmlElement("Add", typeof(Add))]
[XmlElement("Subtract", typeof(Divide))]
[XmlElement("Divide", typeof(Divide))]
[XmlElement("Operator", typeof(Operand))]
我猜您想使用XmlSerializer。
如果需要“多态”反序列化,可以传递序列化程序应该知道的类型列表(如果它们都从同一基类继承,但不是从接口继承,则可以这样做)
例如:
List<Type> extraTypes = new List<Type>();
extraTypes.Add(typeof(multiple));
extraTypes.Add(typeof(add));
extraTypes.Add(typeof(substract));
extraTypes.Add(typeof(divide));
var ser = new XmlSerializer(typeof(Foo), extraTypes.ToArray());
这样,您只有一个基类,所以一切都更简单。如果这有意义的话,我想反序列化它并不难
编辑:
如果基类是Calculator(而不是Expression),则XML将如下所示:
<Calculator xsi:type="Multiple">
<calculators>
<Calculator xsi:type="Add">
<calculators>
<Calculator xsi:type="Operator">
<value>12</value>
</Calculator>
</calculators>
</Calculator>
</calculators>
</Calculator>
12
我创建了一个简单的calculator对象并将其序列化,这就是我得到的。如果你将它反序列化,你将得到一个返回12的计算器
也许您可以使用XmlAttributes更改XML中元素的名称,或者在最坏的情况下编写您自己的反序列化程序。您的实现真的节省了我的时间。但有些事情我仍然感到困惑,所以如果你能花一些宝贵的时间解释一下,我将不胜感激。第一:paremeter
结构中name
paremeter的含义是什么?当我反序列化XML时,它应该是什么?(像“add”|“subtract”|“multiple”|“divide”这样的操作名称)第二:我必须将参数的类型也传递给XmlSerializer
?再次感谢您的回复,祝您度过愉快的一天,先生!参数类(可能名称不是很好)用于简单操作数(例如a、b、c、d)。我不知道你将如何使用它。从哪里获得操作数的值(a=10)?您应该将参数类添加到ExtraType。我将编辑我的答案以反映它。谢谢你的建议,我会尝试一下,并将尽快反馈给你。祝您今天愉快,先生!我编辑了我的问题。如果您能花点时间审阅,我将不胜感激。我已将使用您的代码序列化的XML添加到我的答案中
<Calculator xsi:type="Multiple">
<calculators>
<Calculator xsi:type="Add">
<calculators>
<Calculator xsi:type="Operator">
<value>12</value>
</Calculator>
</calculators>
</Calculator>
</calculators>
</Calculator>