在XML中序列化抽象类

时间:2013-09-23 13:24:46

标签: c# xml deserialization abstract xmlserializer

我从Web服务请求中获得了以下XML。

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

但我也可以拥有以下内容。

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

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

[XmlInclude(typeof(Create))]
[XmlInclude(typeof(Delete))]
public abstract class Operation
{
    protected string Name {get; set;}
    protected string Reference {get; set;}
    ...
}

其中Create和Delete类都继承自,而且类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)。有人能指出我正确的方向吗?

1 个答案:

答案 0 :(得分:1)

如果将Operation设计为List,则可能有效。如果您需要采取措施,该类用户将始终只有一个操作,则将此列表属性隐藏到普通用户,并在设置了[XmlIgnore]时发布操作属性。

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

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