我正在使用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效率,但不使用属性?
答案 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
如果这些路线不是一个选项,我相信你断言你必须为整个地图内容编写一个序列化器。