整个错误消息在这里:
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);
}
}
}
}
答案 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框架的版本中。