XNA: сериализация объекта в изолированное хранилище - PullRequest
0 голосов
/ 17 февраля 2012

У меня есть класс, который определяет мой уровень. У меня есть XML-файл в моем Content Project, в котором хранится информация об уровне.

Я могу загрузить детали XML-файла из Content Project с помощью LoadContent (). Это создает объект со всеми деталями из файла XML.

Теперь я хочу сохранить этот игровой уровень в изолированном хранилище.

Все примеры, которые я видел, указывают на то, что мне нужно использовать XMLWriter и XMLSerializer. Это почему? Могу ли я не использовать механизм, который платформа XNA использует для загрузки из конвейера контента?

1 Ответ

4 голосов
/ 17 февраля 2012

Вам не нужен XMLWriter или XMLSerializer, но вам нужен сериализатор. Ниже приведен пример моей универсальной утилиты IsolatedStorage

public static void Save<T>(string fileName, T item)
{
    using (IsolatedStorageFile storage = IsolatedStorageFile.GetUserStoreForApplication())
    {
        using (IsolatedStorageFileStream fileStream = new IsolatedStorageFileStream(fileName, FileMode.Create, storage))
        {
            DataContractSerializer serializer = new DataContractSerializer(typeof(T));
            serializer.WriteObject(fileStream, item);
        }
    }
}

public static T Load<T>(string fileName)
{
    using (IsolatedStorageFile storage = IsolatedStorageFile.GetUserStoreForApplication())
    {
        using (IsolatedStorageFileStream fileStream = new IsolatedStorageFileStream(fileName, FileMode.Open, storage))
        {
            DataContractSerializer serializer = new DataContractSerializer(typeof(T));
            return (T)serializer.ReadObject(fileStream);
        }
    }
}

Когда ВЫ ссылаетесь на XML как на контент XNA, он компилируется через ContentPipeline. Поэтому, когда вы загружаете контент, вы делаете это через ContentManager. Этот файл XML, на который есть ссылка, должен НЕ находиться в ContentPipeline, потому что тогда его нельзя изменить. Вы должны оставить статические файлы, на которые есть ссылки через ContentPipline, и оставить все динамические файлы сохраненными в IsolatedStorage. После того, как файлы скомпилированы, их нельзя изменить, поэтому их нельзя сохранить в ContentPipeline.

...