XML序列化使用Attribute的值派生类型

时间:2016-03-14 18:06:37

标签: c# xml serialization deserialization

我正在修改一组被序列化的类,我有一个问题,我无法找到答案。旧类有一个非常大的类Control,它通过ControlType属性进一步分类

enum ControlType
{
    ControlType1 = 0,
    ControlType2 = 1
}

public class Control
{
    [XmlAttribute("a")]
    public string a { get; set; }

    [XmlAttribute("b")]
    public string b { get; set; }

    [XmlAttribute("Type")]
    public ControlType Type {get; set;)
}

在原始设计器上面的简化示例中没有将类分离为子类。我们真正想要的是

class baseControl
{
     [XmlAttribute("Type")]
     public ControlType Type {get; set;}
}

class Control1 : baseControl
{
    [XmlAttribute("a")]
    public string a { get; set; }
}

class Control2 : baseControl
{ 
    [XmlAttribute("b")]
    public string b { get; set; }
}

我们希望将类分开,但我们希望原始的xml兼容

在旧层次结构中,所有控件类型(由ControlType定义)都被序列化为

<Control Type="ControlType1" a="xxxx" />
<Control Type="ControlType2" b="xxxxx" />

如果我们使用新结构显然新结构看起来像

<Control1 Type="ControlType1" a="xxxx" />
<Control2 Type="ControlType2" b="xxxxx" />

但我们确实希望将所有新派生类序列化为“Control”,当我们反序列化时,我们希望根据Attribute的值将分配的类型更改为派生类型。

这可能吗?

1 个答案:

答案 0 :(得分:0)

实现此类行为的唯一机会是在与周围元素对应的类上实现IXmlSerializable,并提供自定义(反)序列化行为。

public class ControlContainer : IXmlSerializable
{
    // a single / array of / list of BaseControls
    public BaseControl Control { get; set; }

    // … any other properties

    // … implement IXmlSerializable here to have Control 
    // and any other properties (de)serialized
}