【发布时间】:2009-06-11 19:47:22
【问题描述】:
我正在使用 XNA 3 构建游戏,并且以 XML 格式存储关卡。对于将这些 XML 文件反序列化为关卡对象,您会推荐什么解决方案?它需要能够在 Xbox 上运行。
【问题讨论】:
标签: c# xml xna serialization
我正在使用 XNA 3 构建游戏,并且以 XML 格式存储关卡。对于将这些 XML 文件反序列化为关卡对象,您会推荐什么解决方案?它需要能够在 Xbox 上运行。
【问题讨论】:
标签: c# xml xna serialization
我还没有在 360 上尝试过(我打赌它会起作用),但是 XmlSerializer 是一种非常简单的方法,可以将对象图保存/加载到 XML 中。基本上,您获取您的 xml 文件并针对它运行 xsd.exe。这将生成一组 C# 类,您可以将 XML 反序列化为这些类。在您的代码中,您将编写如下内容:
var serializer = new XmlSerializer(typeof(LevelType));
var level = (LevelType)serializer.Deserialize(streamToYourLevel);
全部完成。
【讨论】:
我不建议(反)序列化实际关卡,只需创建一个简单的容器类,其中包含从中构造关卡对象的信息。
类似:
[Serializable()]
public class LevelDefinition
{
public Vector3 PlayerStartPosition { get; set; }
public string LevelName { get; set; }
public List<Enemy> Enemies { get; set; }
... etc
}
这将产生漂亮、干净的 XML。
然后只需使用XmlSerializer 类对其进行反序列化。
【讨论】:
我认为二进制序列化不适用于 Zune 和 Xbox,但 XmlSerializer 对我来说很好用。我对集合进行序列化没有问题,但是您必须对像 ArrayList 这样的无类型集合使用 XmlArrayItem 属性,或者将附加类型信息传递给 XmlSerializer 构造函数,但现在使用 List 更好更简单。字典无法序列化,但您可以为此创建一个包装类。我通常为每个项目存储一个唯一的 ID,然后可以将其用作字典中的键。 然后我可以创建一个包含 Dictionary 但作为项目集合公开的类。
public class MyItem {
public string ID { get; set; }
:
}
public class MyList : ICollection<MyItem> {
private Dictionary<string,MyItem> items;
public MyList() {
items = new Dictionary<string, MyItem>();
}
void Add(MyItem item) {
items.Add(item.ID, item);
}
:
}
【讨论】: