Comment utiliser les fichiers XML comme fichiers de contenu dans XNA?

9

J'ai un fichier XML représentant différents constructeurs automobiles qui sera disponible dans mon jeu. Le fichier ressemble à ceci:

<?xml version="1.0" encoding="utf-8" ?>
<XnaContent>
  <Asset Type="List[string]">
    <car>Audi</car>
    <car>BMW</car>
    <car>Nissan</car>
    <car>Volvo</car>
  </Asset>
</XnaContent>

Lors de l'ajout dans mon dossier de contenu, le compilateur renvoie cette erreur:

There was an error while deserializing intermediate XML. Cannot find type "List`1"

Comment puis-je créer une liste de chaînes, la mettre en XML et la lire depuis XNA?

eflles
la source
Votre code de désérialisation serait utile ici.
Tetrad
3
Je n'ai pas de code de désérialisation. C'est peut-être là que commence mon problème?
eflles
3
Pour répondre à la question de Tetrad: vraisemblablement eflles utilise la XmlImporterpartie du XNA Content Pipeline. Le pipeline désérialise le XML afin de le convertir en un fichier XNB (qui sera ensuite chargé par ContentManagerau moment de l'exécution).
Andrew Russell

Réponses:

14

Je n'ai pas essayé de découvrir exactement ce qui ne va pas avec votre XML - c'est probablement le manque d'un espace de noms. Mais voici le XML correct:

<?xml version="1.0" encoding="utf-8"?>
<XnaContent xmlns:Generic="System.Collections.Generic">
  <Asset Type="Generic:List[string]">
    <Item>Audi</Item>
    <Item>BMW</Item>
    <Item>Nissan</Item>
    <Item>Volvo</Item>
  </Asset>
</XnaContent>

Sous le capot l' XmlImporterutilise la IntermediateSerializerclasse. Ainsi, un petit programme comme le suivant peut être utilisé pour déterminer à quoi devrait ressembler votre XML :

var test = new List<string>(){ "Audi", "BMW", "Nissan", "Volvo" };
var sb = new StringBuilder();
using(XmlWriter writer = XmlWriter.Create(sb))
{
    IntermediateSerializer.Serialize(writer, test, null);
}
Console.Write(sb.ToString());

(Vous pouvez même convertir la sortie en un flux, la transmettre à la Deserializeméthode et reconstruire l'objet - juste pour être doublement sûr que cela fonctionne. De plus, il vaut probablement la peine de mettre le bon encodage dans l'en-tête - par exemple: StringBuilderis utf-16 .)

Pour des informations détaillées sur IntermediateSerializer, consultez le blog de Shawn Hargreaves, en commençant par ce post et en continuant à travers les archives jusqu'en août 2008.

Andrew Russell
la source
1
+1 La série d'articles de Shawn Hargreaves à ce sujet est excellente. Le moyen le plus simple de générer votre XML est d'avoir un projet "LevelEditor" qui a tout le même code, mais référence les assemblys Content Pipeline afin que vous puissiez créer vos objets avec des attributs par défaut dans le code, puis les sérialiser en XML pour les charger dans votre réel projet de jeu.
michael.bartnett
0

Si vous voulez voir comment le faire par exemple de code, voici un exemple qui utilise xml comme vous voulez http://create.msdn.com/en-US/education/catalog/sample/collision

Si vous souhaitez lire des articles expliquant ce qui se passe et avoir un aperçu de la façon de travailler avec xml et le processeur de contenu, accédez à ce lien, faites défiler jusqu'à la section du sérialiseur intermédiaire et lisez les 8 ou 9 articles. http://www.talula.demon.co.uk/blogindex.html

Steve H
la source