我正在修改一组被序列化的类,我有一个问题,我无法找到答案。旧类有一个非常大的类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的值将分配的类型更改为派生类型。
这可能吗?
答案 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
}