在IntermediateSerializer中使用XML属性

时间:2012-03-18 16:58:06

标签: c# xna-4.0 xml-attribute

我正在使用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编写一个Serializer?

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

1 个答案:

答案 0 :(得分:1)

您始终可以考虑编写自己的XML Content Pipeline Extension。我并不是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

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