Como usar arquivos XML como arquivos de conteúdo no XNA?

9

Eu tenho um arquivo XML representando diferentes fabricantes de carros que estarão disponíveis no meu jogo. O arquivo fica assim:

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

Ao adicioná-lo à minha pasta de conteúdo, o compilador retorna este erro:

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

Como posso criar uma lista de strings, colocá-lo em XML e lê-lo no XNA?

eflles
fonte
Seu código de desserialização seria útil aqui.
Tétrada
3
Não tenho código de desserialização. Talvez seja aí que meu problema começa?
eflles 17/04/11
3
Para responder à pergunta de Tetrad: presumivelmente, os eflles estão usando a XmlImporterparte do XNA Content Pipeline. O pipeline desserializa o XML para convertê-lo em um arquivo XNB (que será carregado ContentManagerno tempo de execução).
Andrew Russell

Respostas:

14

Não tentei descobrir exatamente o que há de errado com o seu XML - provavelmente é a falta de um espaço para nome. Mas aqui está o XML correto:

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

Sob o capô, XmlImportera IntermediateSerializerclasse é usada . Assim, um pequeno programa como o seguinte pode ser usado para determinar o que seu XML deve ser parecido:

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

(Você pode até converter a saída em um fluxo, passá-la para o Deserializemétodo e reconstruir o objeto - apenas para ter certeza de que está funcionando. Também vale a pena colocar a codificação correta no cabeçalho - por exemplo: StringBuilderis utf-16 .)

Para obter informações detalhadas IntermediateSerializer, dê uma olhada no blog de Shawn Hargreaves, começando com este post e continuando nos arquivos até agosto de 2008.

Andrew Russell
fonte
11
A série de postagens de Shawn Hargreaves sobre +1 é ótima. A maneira mais fácil de gerar seu XML é ter um projeto "LevelEditor" que tenha o mesmo código, mas referencie os assemblies do Content Pipeline para que você possa criar seus objetos com atributos padrão no código e depois serializá-los em XML para carregar em seu diretório real. projeto de jogo.
Michael.bartnett
0

Se você quiser ver como fazê-lo por exemplo de código, veja um exemplo que usa xml como você deseja http://create.msdn.com/en-US/education/catalog/sample/collision

Se você quiser ler artigos explicando o que está acontecendo e obter informações sobre como trabalhar com xml e o processador de conteúdo, acesse este link, role a tela para baixo até a seção serializador intermediário e leia os 8 ou 9 artigos. http://www.talula.demon.co.uk/blogindex.html

Steve H
fonte