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的吗?你实际上得到了什么错误?我没有任何反序列化的东西。我不知道那是什么意思,我