【发布时间】:2017-10-05 09:29:53
【问题描述】:
第二天我试图解决我的问题,我想我需要一些帮助才能做到这一点。 =/
所以,我正在尝试为我的项目创建一个 UI,它为每个阶段(或屏幕,无论你如何命名)将采用 XML 并从中构建对象。
基本上,我的代码如下所示:
舞台的基本类 - 所有其他都继承自这个:
class BaseStage {
[XmlIgnore]
public Type Type;
[XmlIgnore]
public string XmlPath;
public BaseChildren UIScheme;
public BaseStage()
{
Type = GetType();
XmlPath = "Template/" + Type.ToString().Replace("Some.Project.Namespace.", "") + ".xml";
}
public virtual void LoadContent()
{
if (File.Exists(XmlPath))
{
using (TextReader reader = new StreamReader(XmlPath))
{
XmlSerializer uiDeserializer = new XmlSerializer(typeof(BaseChildren));
UIScheme = (BaseChildren)uiDeserializer.Deserialize(reader);
}
}
}
一些 UI 类:
public class BaseChildren
{
public List<BaseChildren> Children = new List<BaseChildren>();
public virtual void AddChild(BaseChildrenchild)
{
Children.Add(child);
}
}
public class Dialog : BaseChildren {
public string Type;
public Rectangle Position;
}
public class Label : BaseChildren {}
// ... and so on
我的 XML 文件:
<?xml version="1.0" encoding="utf-8" ?>
<UIScheme>
<Children>
<Dialog>
<Type>Blue</Type>
<Position>
<X>43</X>
<Y>100</Y>
<Width>350</Width>
<Height>200</Height>
</Position>
</Dialog>
</Children>
</UIScheme>
我尝试了很多变体,但不知道如何强制序列化程序加载这些对象 =/ 我也尝试过重写 XmlSerializer 并尝试编写自己的阅读函数,但在 Google 中甚至很难找到如何正确执行此操作的任何教程。
【问题讨论】:
-
嗯,您在 xml 中的根对象是
UIScheme,而在您的类层次结构中是BaseStage。 -
你的问题是事先不知道
BaseStage的哪个子类被序列化到了文件中,所以不知道提前传递给XmlSerializer的类型是什么?因为正如@HimBromBeere 所指出的,根 XML 元素不对应于BaseStage,它对应于完全不同的东西,称为UIScheme。
标签: c# xml user-interface xmlserializer