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.