反序列化中间XML时出错。找不到类型

时间:2012-09-02 21:12:20

标签: c# xml xna

整个错误消息在这里:

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;

这个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);
            }
        }
    }
}

3 个答案:

答案 0 :(得分: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。 Here is an example of how to do this

答案 1 :(得分:0)

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

答案 2 :(得分: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框架的版本中。