【问题标题】:De serializing abstract classes in XML在 XML 中反序列化抽象类
【发布时间】:2013-09-23 13:24:45
【问题描述】:

我有以下来自 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)。有人能指出我正确的方向吗?

【问题讨论】:

    标签: c# xml deserialization abstract xmlserializer


    【解决方案1】:

    如果您将操作设计为列表,可能会起作用。如果您需要采取措施确保该类的用户始终只有一个操作,则将此列表属性隐藏给普通用户并发布一个操作属性,同时设置 [XmlIgnore]。

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

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

    【讨论】:

      猜你喜欢
      • 2010-10-12
      • 1970-01-01
      • 2017-11-06
      • 2011-04-07
      • 2016-01-04
      • 2012-11-18
      • 2011-10-07
      • 2020-02-22
      相关资源
      最近更新 更多