Як використовувати XML-файли як файли вмісту в XNA?


9

У мене є XML-файл, який представляє різні виробники автомобілів, які будуть доступні в моїй грі. Файл виглядає приблизно так:

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

Додаючи його до моєї папки вмісту, компілятор повертає цю помилку:

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

Як я можу створити список рядків, помістити його в XML і прочитати з XNA?


Ваш десеріалізуючий код тут буде корисний.
Тетрад

3
Я не маю десеріалізуючого коду. Можливо, саме тут починається моя проблема?
eflles

3
Щоб відповісти на питання Тетрада: імовірно, eflles використовує XmlImporterчастину конвеєра контенту XNA. Конвеєр десеріалізує XML для того, щоб перетворити його у XNB-файл (який буде завантажений ContentManagerпід час виконання).
Ендрю Рассел

Відповіді:


14

Я не намагався з’ясувати, що не так з вашим XML - це, мабуть, відсутність простору імен. Але ось правильний XML:

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

Під кришкою XmlImporterвикористовується IntermediateSerializerклас. Тож невелика програма на зразок наступної може бути використана для визначення того, як має виглядати ваш 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());

(Ви навіть можете конвертувати вихід у потік, передавати його Deserializeметоду та реконструювати об’єкт - просто щоб бути вдвічі впевненим, що він працює. Також, ймовірно, варто ввести правильне кодування в заголовок - наприклад: StringBuilderutf-16 .)

Щоб дізнатися більше про глибоку інформацію IntermediateSerializer, перегляньте блог Шона Харгрівса, починаючи з цієї публікації та продовжуючи в архівах до серпня 2008 року.


1
+1 Серія дописів Шона Харгрівса про це чудово. Найпростіший спосіб генерувати ваш XML - це створити проект "LevelEditor", який має все той же код, але містить посилання на збірки конвеєрного конвеєра, щоб ви могли створювати свої об'єкти з атрибутами за замовчуванням у коді, а потім серіалізувати їх у XML для завантаження у ваш фактичний ігровий проект.
michael.bartnett

0

Якщо ви хочете побачити, як це зробити на прикладі коду, ось зразок, який використовує xml, як ви хочете http://create.msdn.com/en-US/education/catalog/sample/collision

Якщо ви хочете прочитати статті, що пояснюють, що відбувається, і отримати уявлення про те, як працювати з xml та процесором вмісту, перейдіть за цим посиланням, прокрутіть униз до розділу проміжного серіалізатора і прочитайте там 8 чи 9 статей. http://www.talula.demon.co.uk/blogindex.html

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.