2009-06-11 6 views
1

Je construis un jeu en XNA 3 et j'ai les niveaux stockés au format XML. Quelle solution recommanderiez-vous pour désérialiser ces fichiers XML en objets de niveau? il doit être capable de travailler sur la Xbox.XML XNA Désérialisation d'objet

Répondre

1

Je ne recommande pas (dé) sérialiser les niveaux réels, il suffit de créer une classe de conteneur simple qui contient les informations pour construire un objet de niveau à partir de lui.

quelque chose comme:

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

    ... etc 
} 

Cela se traduira par XML agréable, propre.

Ensuite, utilisez la classe XmlSerializer pour la désérialiser.

+0

Je vais avec ça. Bonne idée! – RCIX

+0

J'ai eu quelques problèmes parfois en sérialisant des choses parfois, particulièrement des collections. Si cela vous arrive, vous pouvez les marquer pour la sérialisation binaire – jasonh

2

Je ne l'ai pas essayé sur le 360 ​​(je parie que ça marchera), mais XmlSerializer est un moyen simple et efficace d'enregistrer/charger vos graphiques d'objets en XML. Fondamentalement, vous prenez votre fichier xml et lancez xsd.exe contre lui. Cela générera un ensemble de classes C# dans lesquelles vous pouvez désérialiser votre XML. Dans votre code, vous allez écrire quelque chose comme:

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

Tout est fait.

+0

Cela pourrait fonctionner. Je vais essayer quand j'ai une chance. Merci! – RCIX

1

Je ne pense pas que la sérialisation binaire soit disponible pour Zune et XBox mais XmlSerializer fonctionne bien pour moi. Je n'ai aucun problème à sérialiser les collections mais vous devez utiliser l'attribut XmlArrayItem pour les collections non typées comme ArrayList ou transmettre des informations de type additonal au constructeur XmlSerializer mais il est préférable et plus simple d'utiliser List de nos jours. Le dictionnaire ne peut pas être sérialisé mais vous pouvez créer une classe wrapper pour cela. Je stocke généralement un identifiant unique pour chaque élément qui peut ensuite être utilisé comme clé dans le dictionnaire. Ensuite, je peux créer une classe qui enveloppe un dictionnaire mais exposée comme une collection d'éléments.

Questions connexes