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

C# 在处理多级继承时,如何最小化重复的xml属性?,c#,xml,inheritance,C#,Xml,Inheritance,我为XNA引擎编写了一个UI框架,目前可以通过代码轻松定义用户界面。我希望通过允许通过XML定义用户界面,使其更易于使用 我一直坚持创建反序列化类。问题是根目录包含一个项集合,而某些项可能包含一个或多个子项。现在我有一些类似的东西: [XmlRoot] public class RootClass { [XmlArray] [XmlArrayItem("ClassA", typeof(ClassA)] [XmlArrayItem("ClassB", typeof(Clas

我为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; }
}
[XmlRoot]
公共类根类
{
[XmlArray]
[XmlArrayItem(“ClassA”,typeof(ClassA)]
[XmlArrayItem(“B类”,类型(B类)]
公共列表类{get;set;}
}
公共类基类
{
[XmlAttribute]
公共字符串名称{get;set;
}
公共类ClassA:基类
{
[XmlAttribute]
公共字符串AValue{get;set;
[XmlArray]
[XmlArrayItem(“ClassA”,typeof(ClassA)]
[XmlArrayItem(“B类”,类型(B类)]
公共列表子项{get;set;}
}
公共类ClassB:基类
{
[XmlAttribute]
公共字符串BValue{get;set;
[XmlElement(“ClassA”,类型(ClassA)]
[XmlElement(“ClassB”,类型(ClassB)]
公共基类单子女{get;set;}
}
这样做的目的是根可以包含任意数量的子类,但是
ClassA
元素可以包含任意数量的子类,而
ClassB
类型可以包含单个子类

这有一个巨大的可维护性问题,因为当我添加从
BaseClass
继承的新类时(例如
ClassC
),我需要将一个新的
XmlArrayItem
属性添加到
RootClass.Classes
属性和所使用的每个其他列表中。如果
ClassC
还包含一个类列表,那么这就是我现在需要维护
XmlArrayItem
属性列表的3个点。我还需要确保任何单个类值都具有向它们添加了一个新的
[xmlement]
属性


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

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


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

问题是,如果我需要一个不从
基类继承的类,但仍然需要子类,那么我仍然有相同的问题(例如,网格可能有一个单元格集合,每个单元格只有一个子类)(这是对有人问我为什么不能为有子类的基类创建另一个继承层的回答)