2012-03-18 40 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