我有一个用于编写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
属性。
是否有更简单的方法来避免在每个反序列化类中重复这些继承映射?
答案 0 :(得分:1)
另一种方法是实现 IXmlSerializable 。 我已经在我自己的项目中完成了这个,以处理复杂继承的序列化和反序列化。您可以使用被子类覆盖的ReadXml / WriteXml方法来“控制”de / serialization。
如果你的框架中有一些“动态”机制,比如在程序运行时加载的类型扩展类,或者你不想每次都编辑你的属性,那么单独实现IXmlSerializable会更好。如果你这样做,你必须序列化类的类型。在反序列化时,您可以通过“Activator”和已序列化的类型创建对象。