Как использовать файлы 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?

eflles
источник
Ваш десериализационный код будет полезен здесь.
Тетрад
3
У меня нет десериализационного кода. Может быть, это где моя проблема начинается?
eflles
3
Чтобы ответить на вопрос Тетрада: по-видимому, Эфлс использует 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методу и реконструировать объект - просто чтобы быть уверенным, что он работает вдвойне. Также, вероятно, стоит поместить правильную кодировку в заголовок - например: StringBuilderis utf-16 .)

Для получения более подробной информации о IntermediateSerializerблоге Шона Харгривза, начните с этого поста и продолжайте изучать архивы до августа 2008 года.

Эндрю Рассел
источник
1
+1 Серия сообщений Шона Харгривза об этом великолепна. Самый простой способ генерировать ваш XML - это иметь проект «LevelEditor», который имеет все тот же код, но ссылается на сборки Content Pipeline, так что вы можете создавать свои объекты с атрибутами по умолчанию в коде, а затем сериализовать их в XML для загрузки в ваш фактический игровой проект.
Майкл Бартнетт
0

Если вы хотите увидеть, как это сделать на примере кода, вот пример, который использует xml, как вы хотите http://create.msdn.com/en-US/education/catalog/sample/collision

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

Стив Н
источник