Come utilizzare i file XML come file di contenuto in XNA?


9

Ho un file XML che rappresenta diversi produttori di auto che saranno disponibili nel mio gioco. Il file è simile al seguente:

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

Quando lo aggiungo nella mia cartella del contenuto, il compilatore restituisce questo errore:

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

Come posso creare un elenco di stringhe, inserirlo in XML e leggerlo da XNA?


Il tuo codice di deserializzazione sarebbe utile qui.
Tetrad,

3
Non ho un codice deserializzante. Forse è qui che inizia il mio problema?
Eflles,

3
Per rispondere alla domanda di Tetrad: presumibilmente eflles sta usando la XmlImporterparte della XNA Content Pipeline. La pipeline deserializza l'XML per convertirlo in un file XNB (che verrà quindi caricato ContentManagerin fase di esecuzione).
Andrew Russell,

Risposte:


14

Non ho provato a scoprire esattamente cosa c'è di sbagliato nel tuo XML - è probabilmente la mancanza di uno spazio dei nomi. Ma ecco l'XML corretto:

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

Sotto il cofano XmlImporterusa la IntermediateSerializerclasse. Quindi un piccolo programma come il seguente può essere usato per determinare come dovrebbe essere il tuo 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());

(Puoi anche convertire l'output in un flusso, passarlo al Deserializemetodo e ricostruire l'oggetto - solo per essere doppiamente sicuro che funzioni. Inoltre vale probabilmente la pena inserire la giusta codifica nell'intestazione - ad esempio: StringBuilderis utf-16 .)

Per alcune informazioni approfondite su IntermediateSerializer, dai un'occhiata al blog di Shawn Hargreaves, a partire da questo post e proseguendo attraverso gli archivi fino ad agosto 2008.


1
+1 La serie di post di Shawn Hargreaves su questo è grandiosa. Il modo più semplice per generare il tuo XML è avere un progetto "LevelEditor" che abbia lo stesso codice, ma faccia riferimento agli assembly della pipeline di contenuti in modo da poter creare i tuoi oggetti con attributi predefiniti nel codice e quindi serializzarli in XML per caricarli nel tuo effettivo progetto di gioco.
michael.bartnett,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.