Wie verwende ich XML-Dateien als Inhaltsdateien in XNA?

9

Ich habe eine XML-Datei, die verschiedene Autohersteller darstellt und in meinem Spiel verfügbar sein wird. Die Datei sieht folgendermaßen aus:

<?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>

Beim Hinzufügen zu meinem Inhaltsordner gibt der Compiler den folgenden Fehler zurück:

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

Wie kann ich eine Liste von Zeichenfolgen erstellen, in XML einfügen und von XNA lesen?

eflles
quelle
Ihr Deserialisierungscode wäre hier hilfreich.
Tetrad
3
Ich habe keinen Deserialisierungscode. Vielleicht beginnt hier mein Problem?
Eflles
3
Um Tetrads Frage zu beantworten: Vermutlich verwendet eflles den XmlImporterTeil der XNA Content Pipeline. Die Pipeline deserialisiert das XML, um es in eine XNB-Datei zu konvertieren (die dann ContentManagerzur Laufzeit von geladen wird ).
Andrew Russell

Antworten:

14

Ich habe nicht versucht, genau herauszufinden, was mit Ihrem XML nicht stimmt - es ist wahrscheinlich das Fehlen eines Namespace. Aber hier ist das richtige XML:

<?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>

Unter der Haube XmlImporterbenutzt der die IntermediateSerializerKlasse. So ein kleines Programm , wie die folgenden verwendet werden kann , um festzustellen , was Ihre XML sollte wie folgt aussehen:

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());

(Sie können die Ausgabe sogar in einen Stream konvertieren, an die DeserializeMethode übergeben und das Objekt rekonstruieren - nur um doppelt sicher zu sein, dass es funktioniert. Außerdem lohnt es sich wahrscheinlich, die richtige Codierung in den Header StringBuildereinzufügen - z. B.: Ist utf-16 .)

Ausführliche Informationen zu IntermediateSerializerfinden Sie in Shawn Hargreaves 'Blog. Beginnen Sie mit diesem Beitrag und gehen Sie bis August 2008 durch die Archive.

Andrew Russell
quelle
1
+1 Shawn Hargreaves 'Reihe von Posts darüber ist großartig. Der einfachste Weg, um Ihr XML zu generieren, besteht darin, ein "LevelEditor" -Projekt zu haben, das denselben Code enthält, jedoch auf die Content Pipeline-Assemblys verweist, sodass Sie Ihre Objekte mit Standardattributen im Code erstellen und sie dann zum Laden in Ihr aktuelles in XML serialisieren können Spielprojekt.
michael.bartnett
0

Wenn Sie anhand eines Codebeispiels sehen möchten, wie dies funktioniert, finden Sie hier ein Beispiel, das XML verwendet, wie Sie es unter http://create.msdn.com/en-US/education/catalog/sample/collision möchten

Wenn Sie Artikel lesen möchten, in denen erklärt wird, was los ist, und einen Einblick in die Arbeit mit XML und dem Inhaltsprozessor erhalten möchten, gehen Sie zu diesem Link, scrollen Sie zum Abschnitt für den Zwischenserialisierer und lesen Sie dort die 8 oder 9 Artikel. http://www.talula.demon.co.uk/blogindex.html

Steve H.
quelle