如何序列化具有大量子类的抽象类?

How to serialize abstract classes with a large number of subclasses?

提问人:SSave 提问时间:9/30/2023 最后编辑:Ken WhiteSSave 更新时间:10/1/2023 访问量:40

问:

我正在尝试使用包含另一个类的字段序列化一个类,但字段名称出现在 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))]

C# .NET XML 序列化 xmlSerializer

评论

0赞 dbc 9/30/2023
而不是应用 [XmlElement(typeof(BinaryOp))](如 Marc Gravell 的此答案所示)使用 XmlSerializer 序列化派生类。这回答了你的问题吗?[XmlInclude(typeof(BinaryOp))
0赞 dbc 9/30/2023
还有 XML 序列化:反序列化抽象属性时出现问题。这些回答了你的问题吗?
0赞 dbc 9/30/2023
是的,适用于作品,请参阅 dotnetfiddle.net/bfBZso。以副本形式关闭。[XmlElement("BinaryOp", typeof(BinaryOp))public VzExpression child;
0赞 SSave 9/30/2023
@dbc,我有很多这样的 VzExpression 子类。每次使用 VzExpression 时,我是否都必须对每个子类执行此操作?
0赞 dbc 9/30/2023
没有任何内置函数可以执行此操作,若要通过元素名称支持多态性,MSFT 要求向每个属性添加属性。(这里只是一个猜测,但这可能是因为在给定类中可能有多个相同类型的属性。您可以尝试使用指定的序列化程序来制造自定义序列化程序,例如,序列化从类 A 继承到 xml 的对象列表,因此 xml 中元素的名称为 B、C、DXmlAttributeOverrides

答: 暂无答案