2009-06-11 9 views
1

Ich baue ein Spiel in XNA 3 und ich habe die Ebenen im XML-Format gespeichert. Welche Lösung würden Sie für die Deserialisierung dieser XML-Dateien in Level-Objekten empfehlen? Es muss in der Lage sein, auf der Xbox zu arbeiten.XML XNA Object Deserialization

Antwort

1

Ich würde nicht empfehlen (de) serialisieren die tatsächlichen Ebenen, erstellen Sie einfach eine einfache Container-Klasse, die die Informationen enthält, um ein Level-Objekt daraus zu konstruieren.

so etwas wie:

[Serializable()] 
public class LevelDefinition 
{ 
    public Vector3 PlayerStartPosition { get; set; } 
    public string LevelName { get; set; } 
    public List<Enemy> Enemies { get; set; } 

    ... etc 
} 

Diese schöne, saubere XML führen.

Und dann verwenden Sie einfach die XmlSerializer Klasse, um es zu deserialisieren.

+0

Ich gehe damit. Gute Idee! – RCIX

+0

Ich hatte manchmal Probleme, Dinge manchmal zu serialisieren, besonders Sammlungen. Wenn Ihnen das passiert, können Sie sie für die binäre Serialisierung markieren – jasonh

2

Ich habe es nicht auf der 360 versucht (ich wette, es wird funktionieren), aber XmlSerializer ist eine großartige einfache Möglichkeit zum Speichern/Laden Ihrer Objekt-Grafiken in XML. Grundsätzlich nehmen Sie Ihre XML-Datei und führen Sie xsd.exe dagegen aus. Dadurch wird eine Reihe von C# -Klassen generiert, in die Sie Ihre XML-Datei deserialisieren können. In Ihrem Code schreiben Sie etwas wie:

var serializer = new XmlSerializer(typeof(LevelType)); 
var level = (LevelType)serializer.Deserialize(streamToYourLevel); 

Alles fertig.

+0

Dies könnte funktionieren. Ich werde es versuchen, wenn ich eine Chance bekomme. Vielen Dank! – RCIX

1

Ich glaube nicht, binäre Serialisierung ist für Zune und XBox verfügbar, aber XmlSerializer funktioniert gut für mich. Ich habe keine Probleme beim Serialisieren von Sammlungen, aber Sie müssen das XmlArrayItem-Attribut für nicht typisierte Sammlungen wie ArrayList verwenden oder dem XmlSerializer-Konstruktor zusätzliche Typinformationen übergeben, aber es ist heutzutage besser und einfacher, List zu verwenden. Das Dictionary kann nicht serialisiert werden, aber Sie können dafür eine Wrapper-Klasse erstellen. Normalerweise speichere ich für jedes Element eine eindeutige ID, die dann als Schlüssel im Wörterbuch verwendet werden kann. Dann kann ich eine Klasse erstellen, die ein Dictionary umschließt, aber als eine Sammlung von Elementen verfügbar gemacht wird.

public class MyItem { 
    public string ID { get; set; } 
      : 
} 

public class MyList : ICollection<MyItem> { 
    private Dictionary<string,MyItem> items; 
    public MyList() { 
     items = new Dictionary<string, MyItem>(); 
    } 
    void Add(MyItem item) { 
     items.Add(item.ID, item); 
    } 
     : 
} 
Verwandte Themen