【问题标题】:Game UI Xml Deserializer游戏 UI Xml 反序列化器
【发布时间】: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


【解决方案1】:

为了快速检查,您可以使用 http://xmltocsharp.azurewebsites.net/ 将 xml 转换为 C# 类

[XmlRoot(ElementName="Position")]
public class Position {
    [XmlElement(ElementName="X")]
    public string X { get; set; }
    [XmlElement(ElementName="Y")]
    public string Y { get; set; }
    [XmlElement(ElementName="Width")]
    public string Width { get; set; }
    [XmlElement(ElementName="Height")]
    public string Height { get; set; }
}

[XmlRoot(ElementName="Dialog")]
public class Dialog {
    [XmlElement(ElementName="Type")]
    public string Type { get; set; }
    [XmlElement(ElementName="Position")]
    public Position Position { get; set; }
}

[XmlRoot(ElementName="Children")]
public class Children {
    [XmlElement(ElementName="Dialog")]
    public Dialog Dialog { get; set; }
}

[XmlRoot(ElementName="UIScheme")]
public class UIScheme {
    [XmlElement(ElementName="Children")]
    public Children Children { get; set; }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-04
    • 2011-03-03
    相关资源
    最近更新 更多