Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 反序列化中间XML时出错。找不到类型_C#_Xml_Xna - Fatal编程技术网

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

C# 反序列化中间XML时出错。找不到类型,c#,xml,xna,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="Window

整个错误信息如下所示:

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

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

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

问题在于您使用的是
GetAttribute()
方法,而不是
Select(“X”).Value
。例如,代替

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


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

< P>问题是您正在使用<代码> GETAdvestTe()/<代码>方法,而不是执行<代码>选择(“x”)。例如,代替

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


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

< p>看起来您试图使用XNA内容管道来将XML文件构建为内容-所以我的答案将跳过所有的XPath内容。你不需要它

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

哪个对象的实例?在您的例子中,是一个
WindowsGame1.Tile
对象。内容管道如何知道什么是
WindowsGame1.Tile
对象它不会-除非您告诉它-因此会显示错误消息


如何解决此问题?

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

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

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

然后,您可以通过内容管理器在游戏中加载互动程序:

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


如果您的XML格式出现另一个错误(我想我发现了一个错误,但我还没有检查),您可以通过创建
Tile
类型的虚拟实例,然后使用
IntermediateSerializer.Serialize
生成适当的XML来确定应该是什么

看起来您正试图使用XNA内容管道将XML文件构建为内容—因此我的答案将跳过您遇到的所有XPath内容—您不需要它

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

哪个对象的实例?在您的例子中,是一个
WindowsGame1.Tile
对象。内容管道如何知道什么是
WindowsGame1.Tile
对象它不会-除非您告诉它-因此会显示错误消息


如何解决此问题?

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

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

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

然后,您可以通过内容管理器在游戏中加载互动程序:

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


如果您的XML格式出现另一个错误(我想我发现了一个错误,但我还没有检查),您可以通过创建
Tile
类型的虚拟实例,然后使用
IntermediateSerializer.Serialize
生成适当的XML来确定应该是什么

尝试使用属性而不是字段。例如,public int x{get;set;}等。我还尝试了在c#和xml文件中使用非大写字母的较小版本的属性({get;set;})。尝试将XmlElement属性添加到属性中。另外,你能告诉我你是如何反序列化你的XML的吗?你实际上得到了什么错误?我没有任何反序列化的东西。我不知道那是什么意思,我