¿Cómo usar archivos XML como archivos de contenido en XNA?

9

Tengo un archivo XML que representa diferentes fabricantes de automóviles que estarán disponibles en mi juego. El archivo se ve así:

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

Al agregarlo a mi carpeta de contenido, el compilador devuelve este error:

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

¿Cómo puedo crear una lista de cadenas, ponerla en XML y leerla desde XNA?

eflles
fuente
Su código de deserialización sería útil aquí.
Tetrad
3
No tengo código deserializador. Tal vez aquí es donde comienza mi problema?
eflles
3
Para responder a la pregunta de Tetrad: presumiblemente eflles está utilizando la XmlImporterparte de la canalización de contenido XNA. La canalización deserializa el XML para convertirlo en un archivo XNB (que luego se cargará ContentManageren tiempo de ejecución).
Andrew Russell

Respuestas:

14

No he tratado de averiguar exactamente qué hay de malo en tu XML; probablemente sea la falta de un espacio de nombres. Pero aquí está el XML correcto:

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

Debajo del capó XmlImporterusa la IntermediateSerializerclase. Por lo tanto, se puede usar un programa pequeño como el siguiente para determinar cómo debería verse su 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());

(Incluso puede convertir la salida en una secuencia, pasarla al Deserializemétodo y reconstruir el objeto, solo para estar doblemente seguro de que funciona. También probablemente valga la pena poner la codificación correcta en el encabezado, por ejemplo: StringBuilderes utf-16 .)

Para obtener información detallada sobre IntermediateSerializer, eche un vistazo al blog de Shawn Hargreaves, comenzando con esta publicación y continuando a través de los archivos hasta agosto de 2008.

Andrew Russell
fuente
1
+1 La serie de publicaciones de Shawn Hargreaves sobre esto es genial. La forma más fácil de generar su XML es tener un proyecto "LevelEditor" que tenga el mismo código, pero que haga referencia a los ensambles de Content Pipeline para que pueda crear sus objetos con atributos predeterminados en el código, y luego serializarlos en XML para cargarlos en su archivo real. Proyecto de juego.
michael.bartnett