2012-03-18 41 views
2

我正在用XNA制作游戏,并尝试使用IntermediateSerializer将所有级别信息写入XML。在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> 

有什么办法,我可以取回“变量”属性,而无需编写串行器整个MapContent?

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

回答

1

您可以随时考虑编写自己的XML内容管道扩展。我并不是中级串行器的忠实粉丝,因为如你所说,如果你有任何复杂的XML,那么处理起来相当粗糙。

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

这样做,这样也可以让您使用XPath,让你从你的XML,这在我看来,是显著容易的工作所需的信息。

它可能会丢失某些部分,但你可以使用这个指南,更彻底地讨论内容输入扩展补充这些(和做图!):http://rbwhitaker.wikidot.com/content-pipeline-extension-1

如果航线不是一种选择,我相信你在你断言你必须为整个地图内容编写一个序列化程序时是正确的。

+0

那么,我真的不知道是否值得写一个扩展名,但我会看看。至于另一种选择,我认为这将是答案*叹*我想我会离开它就像现在一样。不管怎么说,还是要谢谢你! – Osguima3 2013-04-17 20:45:40