0

整个错误信息在这里:

There was an error while deserializing intermediate XML. Cannot find type
"WindowsGame1.Tile".

我正在制作 XNA 游戏,现在我正在尝试从 xml 文件加载基于图块的关卡。现在,我的 xml 文件如下所示:

<?xml version="1.0" encoding="utf-8"?>
<XnaContent>
  <Asset Type="WindowsGame1.Tile">
    <Tile>
      <X>0</X>
      <Y>0</Y>
      <ImageName>grass-tile</ImageName>
    </Tile>
  </Asset>
</XnaContent>

我的 C# 文件如下所示:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;

namespace WindowsGame1
{
    public class Tile
    {
        public int x;
        public int y;
        public string imageName;

        public int X
        {
            get { return x; }
            set { x = value; }
        }

        public int Y
        {
            get { return y; }
            set { y = value; }
        }
        public string ImageName
        {
            get { return imageName; }
            set { imageName = value; }
        }
    }
}

我有一个类,它使用 XPath 库来解析 xml 文件并将 Tile 排除在外,但现在它都被注释掉了,因为 xml 的东西无论如何都不起作用。在我的 Game1 课程中,我尝试导入:

using WindowsGame1.Tile;

并参考:

Tile tile;

这个瓷砖类,根据我在尝试找到解决方案时发现的建议,但我仍然遇到同样的错误,我的游戏无法构建。任何人都知道我需要改变什么才能让这些 XML 东西正常工作吗?

下面是解析 XML 的代码应该是什么样子的,尽管目前,在我可以编译之前,它都被注释掉了。

namespace WindowsGame1
{
    class ActionScreen : GameScreen
    {
        public ActionScreen(Game game, SpriteBatch spriteBatch, String file,  AnimatedSprite sprite)
            : base(game, spriteBatch)
        {
            this.file = file;
            this.sprite = sprite;
            initializeTiles();
        }

        private void initializeTiles()
        {
            XPathDocument doc = new XPathDocument(file);
            XPathNavigator nav = doc.CreateNavigator();
            XPathNodeIterator iter = nav.Select("tile");

            while (iter.MoveNext())
            {
                int x, y;
                string fileName;

                x = int.Parse(iter.Current.GetAttribute("X", ""));
                y = int.Parse(iter.Current.GetAttribute("Y", ""));
                fileName = iter.Current.GetAttribute("ImageName", "");

                Console.WriteLine(x + " " + y + " " + fileName);
            }
        }
    }
}
4

3 回答 3

3

看起来您正在尝试使用 XNA 内容管道将 XML 文件构建为内容 - 所以我的回答将跳过您提到的所有 XPath 内容 - 您不需要它。

错误所指的“反序列化”是当内容管道试图将您的 XML 转换为对象实例时。然后它获取该对象并将其写入 XNB 文件。稍后,当您的游戏运行时,它将将该 XNB 文件加载回对象实例中。

哪个对象的实例?好吧,在你的情况下,一个WindowsGame1.Tile对象。内容管道如何知道WindowsGame1.Tile对象是什么?它不会-除非你告诉它- 因此会出现错误消息。


你如何解决这个问题?

WindowsGame1.Tile您需要从内容管道项目中引用包含该类型的程序集。

您不能直接引用您的游戏项目 - 因为这会创建循环依赖项(您的游戏项目已经依赖于内容项目)。

因此,您必须将类型WindowsGame1.Tile放入您从游戏项目和内容项目(右键单击内容项目,添加引用,添加项目引用)中引用的单独程序集中(创建一个新的“游戏库项目”)。

然后您可以通过内容管理器在游戏中加载您的图块:

Tile myTile = Content.Load<Tile>("assetName");

如果您收到有关XML格式的另一个错误(我想我发现了一个错误,但我没有检查过),您可以通过创建您的类型的虚拟实例来弄清楚它应该是什么Tile,然后使用IntermediateSerializer.Serialize生成适当的 XML。这是一个如何执行此操作的示例

于 2012-09-04T05:55:49.080 回答
0

问题是您使用的是GetAttribute()方法而不是执行Select("X").Value. 例如,而不是

x = int.Parse(iter.Current.GetAttribute("X", ""));

尝试

x = int.Parse(iter.Current.Select("X").Value, string.Empty));

您可能还需要考虑 System.Xml.Serlization.XmlSerializer 类,因为它更易于使用,但我不知道它是否包含在您正在使用的 XNA 框架版本中。

于 2012-09-03T02:10:01.097 回答
0

要使其正确反序列化,您必须使 XML 和实际类中的属性名称相同。尝试在 Tile 类中将属性“imageName”重命名为“image”。

于 2012-09-02T21:26:10.710 回答