提问人:SSave 提问时间:9/30/2023 最后编辑:Ken WhiteSSave 更新时间:10/1/2023 访问量:40
如何序列化具有大量子类的抽象类?
How to serialize abstract classes with a large number of subclasses?
问:
我正在尝试使用包含另一个类的字段序列化一个类,但字段名称出现在 XML 中。
我有以下课程:
public class CustomExpression
{
[XmlAttribute] public string callFormat;
[XmlAttribute] public string format;
[XmlAttribute] public string name;
[XmlAttribute] public string style;
public VzExpression child;
/* constructor and methods */
}
[XmlInclude(typeof(BinaryOp)) /* other subclasses */]
public abstract class VzExpression {}
public class BinaryOp : VzExpression
{
public VzExpression left;
public VzExpression right;
/* constructor and methods */
}
/* And some more subclasses */
目前序列化为:
<CustomExpression callFormat="" format="" name="" style="">
<child xsi:type="BinaryOp" ...>
<left ... />
<right ... />
</child>
</CustomExpression>
相反,我想要的是(将 VzExpression 替换为具体类型):
<CustomExpression callFormat="" format="" name="" style="">
<BinaryOp ...>
<VzExpression ... />
<VzExpression ... />
</BinaryOp>
</CustomExpression>
我应该如何实现这一点?
正如@dbc所建议的那样,我尝试的一个解决方案是将属性添加到每个子类的字段中。但是,子类的数量很大(~ 10)。有没有办法做到这一点,而不必在每次使用 VzExpression 时应用 10 个属性?[XmlElement("BinaryOp", typeof(BinaryOp))]
答: 暂无答案
评论
[XmlElement(typeof(BinaryOp))](
如 Marc Gravell 的此答案所示)使用 XmlSerializer 序列化派生类。这回答了你的问题吗?[XmlInclude(typeof(BinaryOp))
[XmlElement("BinaryOp", typeof(BinaryOp))
public VzExpression child;
XmlAttributeOverrides