如何在XNA中将XML文件用作内容文件?


9

我有一个XML文件,代表不同的汽车制造商,这些文件将在我的游戏中提供。该文件如下所示:

<?xml version="1.0" encoding="utf-8" ?>
<XnaContent>
  <Asset Type="List[string]">
    <car>Audi</car>
    <car>BMW</car>
    <car>Nissan</car>
    <car>Volvo</car>
  </Asset>
</XnaContent>

将其添加到我的内容文件夹中时,编译器将返回以下错误:

There was an error while deserializing intermediate XML. Cannot find type "List`1"

如何创建字符串列表,将其放入XML并从XNA读取?


您的反序列化代码在这里很有用。
四分

3
我没有反序列化代码。也许这是我的问题开始的地方?
eflles 2011年

3
要回答Tetrad的问题:大概eflles使用的XmlImporter是XNA Content Pipeline的。管道反序列化XML,以便将其转换为XNB文件(然后将ContentManager在运行时加载该文件)。
安德鲁·罗素

Answers:


14

我还没有试图找出XML到底有什么问题-可能是缺少命名空间。但是这里是正确的XML:

<?xml version="1.0" encoding="utf-8"?>
<XnaContent xmlns:Generic="System.Collections.Generic">
  <Asset Type="Generic:List[string]">
    <Item>Audi</Item>
    <Item>BMW</Item>
    <Item>Nissan</Item>
    <Item>Volvo</Item>
  </Asset>
</XnaContent>

在引擎盖下XmlImporter使用IntermediateSerializer类。因此,像下面的小程序可以用来确定你的XML是什么应该是这样的:

var test = new List<string>(){ "Audi", "BMW", "Nissan", "Volvo" };
var sb = new StringBuilder();
using(XmlWriter writer = XmlWriter.Create(sb))
{
    IntermediateSerializer.Serialize(writer, test, null);
}
Console.Write(sb.ToString());

(您甚至可以将输出转换为流,将其传递给Deserialize方法,然后重建对象-只是要确保它能正常工作。另外,可能值得在标头中添加正确的编码-例如:StringBuilderutf-16 )

有关的深入信息IntermediateSerializer,请参阅Shawn Hargreaves的博客,从此帖子开始,一直浏览到存档,直至2008年8月。


1
+1 Shawn Hargreaves关于此的一系列帖子很棒。生成XML的最简单方法是拥有一个“ LevelEditor”项目,该项目具有全部相同的代码,但引用内容管道程序集,因此您可以在代码中使用默认属性创建对象,然后将其序列化为XML以在实际中加载游戏项目。
michael.bartnett

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.