2

我正在使用 XNA 制作游戏,并尝试使用IntermediateSerializer将所有级别信息写入 XML 。

到目前为止,我这样做没有问题,但是 XML 的标签太多了,我想让它更有效率。

例如,我有这个:

<Asset Type="Data:MapContent">
  <Zone>Jungle</Zone>
  <MapID>Jungle01</MapID>
  <Size>42 40</Size>
  <Objects>
    <MapObject>
      <Tag>Tree</Tag>
      <Position>12.10001 1.41174912 9.433376</Position>
    </MapObject>
    <MapObject>
    ...

我想谈谈这个:

<Asset Type="Data:MapContent">
  <Zone>Jungle</Zone>
  <MapID>Jungle01</MapID>
  <Size>42 40</Size>
  <Objects>
    <MapObject Tag="Tree">12.10001 1.41174912 9.433376</MapObject>
    ...

这是我尝试为 MapObject 制作的序列化程序

[ContentTypeSerializer]
class MapObjectSerializer : ContentTypeSerializer<MapObject>
{
    protected override void Serialize(IntermediateWriter output, MapObject value, ContentSerializerAttribute format)
    {
        output.Xml.WriteAttributeString("Tag", value.Tag);
        output.WriteObject(value.Position, new ContentSerializerAttribute() { ElementName = "Position", FlattenContent = true });
    }

    protected override MapObject Deserialize(IntermediateReader input, ContentSerializerAttribute format, MapObject existingInstance)
    {
        existingInstance.Tag = input.Xml.GetAttribute("Tag");
        string[] pos = input.Xml.ReadElementString().Split(' ');
        existingInstance.Position = new Vector3(float.Parse(pos[0]), float.Parse(pos[1]), float.Parse(pos[2]));
        return existingInstance;
    }
}

Serialize 函数有效,我得到了我想要的确切 XML,但 Deserialize 方法没有。看起来当方法被调用时,XML 解析器已经在这个位置:

                      v
<MapObject Tag="Tree">12.10001 1.41174912 9.433376</MapObject>

有什么方法可以检索“Tag”属性而无需为整个 MapContent 编写序列化程序?

或者,是否有任何其他方法可以使 XML 高效,但不使用属性?

4

1 回答 1

1

您总是可以考虑编写自己的 XML 内容管道扩展。我不是 Intermediate Serializer 的忠实拥护者,因为正如您所说,如果您有任何复杂的 XML,使用它是相当困难的。

可以在这里找到一个简单的指南: http ://roy-t.nl/index.php/2010/08/07/xna-xml-contentimporter/

这样做还可以让您使用 XPath 从 XML 中获取您想要的信息,在我看来,它更容易使用。

它可能缺少某些部分,但您可以使用本指南补充那些更完整地讨论内容导入器扩展的部分(并做地图!): http ://rbwhitaker.wikidot.com/content-pipeline-extension-1

如果这些路线不是一个选项,我相信你的断言是正确的,你必须为整个地图内容编写一个序列化程序。

于 2013-04-10T18:38:40.430 回答