在 XML 中反序列化抽象类

本文关键字:抽象类 反序列化 XML | 更新日期: 2023-09-27 18:32:21

我有以下XML来自Web服务请求。

<Resource>
    <Create>
       <Name />
       <Reference />
       ...
    </Create>
</Resource>

但是,我也可以有以下内容。

<Resource>
    <Delete>
       <Name />
       <Reference />
       ...
    </Delete>
</Resource>

我有一个名为操作的基类,如下所示:

[XmlInclude(typeof(Create))]
[XmlInclude(typeof(Delete))]
public abstract class Operation
{
    protected string Name {get; set;}
    protected string Reference {get; set;}
    ...
}
创建和删除的类都

继承自,并且名为 Resource 的类都包含Operation属性。

public class Resource
{
    public Operation {get; set;}
}

我想将XML反序列化为类Operation的正确具体实现。

我试过了

using (var reader = XmlReader.Create(new StringReader(xmlData)))
{
    return (T)new XmlSerializer(typeof(T)).Deserialize(reader);
}

其中TResource类型,但无济于事(Operation属性总是null)。有人可以指出我正确的方向吗?

在 XML 中反序列化抽象类

如果将操作设计为列表,则可能有效。如果需要测量类的用户始终只有一个操作,请将此列表属性隐藏给普通用户,并在设置 [XmlIgnore] 的情况下发布操作属性。

也许XmlElement比XmlArrayItem更适合您的需求。

public class Resource
{
    [XmlArrayItem("Create", typeof(Create))]
    [XmlArrayItem("Delete", typeof(Delete))]    
    public List<Operation> {get; set;}
}