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?


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.


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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.