0

我有一个为 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类型可以包含单个子类。

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

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

4

1 回答 1

1

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

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

于 2013-09-04T03:15:43.110 回答