Десериализация объекта XML XNA - PullRequest
1 голос
/ 11 июня 2009

Я создаю игру в XNA 3, и у меня есть уровни, хранящиеся в формате XML. Какое решение вы бы порекомендовали для десериализации этих файлов XML в объекты уровня? он должен быть в состоянии работать на Xbox.

Ответы [ 3 ]

2 голосов
/ 12 июня 2009

Я не пробовал его на 360 (держу пари, он будет работать), но XmlSerializer - отличный способ сохранить / загрузить графики объектов в XML. По сути, вы берете свой XML-файл и запускаете против него xsd.exe. Это создаст набор классов C #, в которые вы можете десериализовать свой XML. В своем коде вы напишите что-то вроде:

var serializer = new XmlSerializer(typeof(LevelType));
var level = (LevelType)serializer.Deserialize(streamToYourLevel);

Все сделано.

1 голос
/ 29 июня 2009

Я не думаю, что двоичная сериализация доступна для Zune и XBox, но XmlSerializer отлично работает для меня. У меня нет проблем с сериализацией коллекций, но вы должны использовать атрибут XmlArrayItem для нетипизированных коллекций, таких как ArrayList, или передавать дополнительную информацию о типе в конструктор XmlSerializer, но в настоящее время использовать List лучше и проще. Словарь не может быть сериализован, но вы можете создать класс-оболочку для этого. Я обычно храню уникальный идентификатор для каждого элемента, который затем можно использовать в качестве ключа в словаре. Затем я могу создать класс, который обернет словарь, но будет представлен как набор элементов.

public class MyItem {
    public string ID { get; set; }
           :
}

public class MyList : ICollection<MyItem> {
    private Dictionary<string,MyItem> items;
    public MyList() {
        items = new Dictionary<string, MyItem>();
    }
    void Add(MyItem item) {
         items.Add(item.ID, item);
    }
        :
}
1 голос
/ 12 июня 2009

Я бы не рекомендовал (де) сериализовывать фактические уровни, просто создаю простой контейнерный класс, который содержит информацию для построения объекта уровня из него.

что-то вроде:

[Serializable()]
public class LevelDefinition
{
    public Vector3 PlayerStartPosition { get; set; }
    public string LevelName { get; set; }
    public List<Enemy> Enemies { get; set; }

    ... etc
}

Это приведет к хорошему, чистому XML.

А затем просто используйте класс XmlSerializer для десериализации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...