Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 用C将xml反序列化为超类对象#_C#_Xml Deserialization - Fatal编程技术网

C# 用C将xml反序列化为超类对象#

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

我正在创建一个程序,允许用户定义公式,使用XML进行4种基本操作:加、减、除、乘。让我们举一个例子:用户想要定义像
(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>