【问题标题】:XML XNA Object DeserializationXML XNA 对象反序列化
【发布时间】:2009-06-11 19:47:22
【问题描述】:

我正在使用 XNA 3 构建游戏,并且以 XML 格式存储关卡。对于将这些 XML 文件反序列化为关卡对象,您会推荐什么解决方案?它需要能够在 Xbox 上运行。

【问题讨论】:

    标签: c# xml xna serialization


    【解决方案1】:

    我还没有在 360 上尝试过(我打赌它会起作用),但是 XmlSerializer 是一种非常简单的方法,可以将对象图保存/加载到 XML 中。基本上,您获取您的 xml 文件并针对它运行 xsd.exe。这将生成一组 C# 类,您可以将 XML 反序列化为这些类。在您的代码中,您将编写如下内容:

    var serializer = new XmlSerializer(typeof(LevelType));
    var level = (LevelType)serializer.Deserialize(streamToYourLevel);
    

    全部完成。

    【讨论】:

      【解决方案2】:

      我不建议(反)序列化实际关卡,只需创建一个简单的容器类,其中包含从中构造关卡对象的信息。

      类似:

      [Serializable()]
      public class LevelDefinition
      {
          public Vector3 PlayerStartPosition { get; set; }
          public string LevelName { get; set; }
          public List<Enemy> Enemies { get; set; }
      
          ... etc
      }
      

      这将产生漂亮、干净的 XML。

      然后只需使用XmlSerializer 类对其进行反序列化。

      【讨论】:

      • 我同意。好主意!
      • 我有时在序列化事物时遇到了一些麻烦,尤其是集合。如果您遇到这种情况,您可以将它们标记为二进制序列化
      【解决方案3】:

      我认为二进制序列化不适用于 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);
          }
              :
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-10-31
        • 2013-09-24
        • 2020-05-10
        • 2023-03-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多