在处理多级继承时,如何最小化重复的xml属性?

时间:2013-09-04 02:12:26

标签: c# xml inheritance

我有一个用于编写XNA引擎的UI框架,目前可以通过代码轻松定义用户界面。我希望通过允许通过XML定义用户界面来使其更容易使用。

我坚持的是创建反序列化类。问题是根包含一组项目,一些项目可能包含一个或多个子项目。现在我有类似的东西:

[XmlRoot]
public class RootClass
{
    [XmlArray]
    [XmlArrayItem("ClassA", typeof(ClassA)]
    [XmlArrayItem("ClassB", typeof(ClassB)]
    public List<BaseClass> Classes { get; set; }
}

public class BaseClass
{
    [XmlAttribute]
    public string Name { get; set;
}

public class ClassA : BaseClass
{
    [XmlAttribute]
    public string AValue { get; set;

    [XmlArray]
    [XmlArrayItem("ClassA", typeof(ClassA)]
    [XmlArrayItem("ClassB", typeof(ClassB)]
    public List<BaseClass> Children { get; set; }
}

public class ClassB : BaseClass
{
    [XmlAttribute]
    public string BValue { get; set;

    [XmlElement("ClassA", typeof(ClassA)]
    [XmlElement("ClassB", typeof(ClassB)]
    public BaseClass SingleChild { get; set; }
}

这样做的意图是根可以包含任意数量的子类,但ClassA元素可以包含任意数量的子类,而ClassB类型可以包含单个子类。 / p>

这有一个巨大的可维护性问题,因为当我添加一个继承自BaseClass的新类(例如ClassC)时,我需要为{{{{}}添加新的XmlArrayItem属性1}}属性到使用的每个其他列表。如果RootClass.Classes还包含一个类列表,那么我现在需要维持ClassC属性列表的3个点。我还需要确保任何单个类值都添加了新的XmlArrayItem属性。

是否有更简单的方法来避免在每个反序列化类中重复这些继承映射?

1 个答案:

答案 0 :(得分:1)

另一种方法是实现 IXmlSerializable 。 我已经在我自己的项目中完成了这个,以处理复杂继承的序列化和反序列化。您可以使用被子类覆盖的ReadXml / WriteXml方法来“控制”de / serialization。

如果你的框架中有一些“动态”机制,比如在程序运行时加载的类型扩展类,或者你不想每次都编辑你的属性,那么单独实现IXmlSerializable会更好。如果你这样做,你必须序列化类的类型。在反序列化时,您可以通过“Activator”和已序列化的类型创建对象。