Форум программистов, компьютерный форум CyberForum.ru

Программирование Windows Phone

Войти
Регистрация
Восстановить пароль
 
bodynar
162 / 162 / 51
Регистрация: 14.03.2015
Сообщений: 674
Записей в блоге: 1
Завершенные тесты: 3
#1

Сохранение данных, Сериализация - Windows Phone

18.02.2016, 00:18. Просмотров 299. Ответов 2
Метки нет (Все метки)

Доброго времени суток.

Имеются вопрос и проблема.

Вопрос: В какой момент работы приложения лучше сохранять данные?
В моем варианте простое приложение по кнопке и заполненным полям добавляет объекты в коллекцию.
По опыту ПК-шных приложений привык сохранять данные перед закрытием приложения (окна\формы\страницы), тут же попробовал также. Кинул обработчик на кнопку "Назад" (ну, ту, которая на всех телефонах)
C#
1
HardwareButtons.BackPressed += HardwareButtonsBackPressed;
И использую код, приведенный ниже (честно скомуниздил написал по примеру многих статей)
Loading
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
async void LoadObject(StorageFile Path)
        {
            using (var readerStream = await Path.OpenStreamForReadAsync())
            {
                var Serializer = new XmlSerializer(ObjCollection.GetType());
                try
                {
                    ObjCollection = (ObservableCollection<Purchase>)Serializer.Deserialize(readerStream);
                }
                catch (Exception e)
                {
                    ShowMessage(string.Format("Exception: {0}\n{1}", e.InnerException, e.Message));
                }
            }
        }
 
        internal async void LoadData(string Path)
        {
            var AppStorage = ApplicationData.Current.LocalFolder;
 
            File = await AppStorage.CreateFileAsync(Path, CreationCollisionOption.OpenIfExists);
 
            var file = await FileIO.ReadTextAsync(File, Windows.Storage.Streams.UnicodeEncoding.Utf8);
 
            if (file.Length > 1)
                LoadObject(File);
 
            if (ObjCollection == null)
                ObjCollection = new ObservableCollection<Purchase>();
        }

Saving
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
internal async void SaveData(StorageFile Path)
        {
            using (var writterStream = await Path.OpenStreamForWriteAsync())
            {
                var Serializer = new XmlSerializer(ObjCollection.GetType());
 
                try
                {
                    Serializer.Serialize(writterStream, ObjCollection);
                }
                catch (Exception e)
                {
                    ShowMessage(string.Format("Exception: {0}\n{1}", e.InnerException, e.Message));
                }
            }
        }


И вызываю метод сохранения (сериализации в смысле) в обработчике BackPressed. Приложение уходит в фон (в диспетчере его видно), сама студия продолжает работать, но ничего не происходит. Выключаю отладку в студии (VSE15) и запускаю заного и сразу ловлю ошибку сериализации (битый XML файл).

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

Также появилась навязчивая идея сохранять данные после каждого его изменения. (но заработает же все!)

Добавлено через 2 часа 11 минут
Проблема решена (магическим образом)

Цитата Сообщение от bodynar Посмотреть сообщение
C#
1
var Serializer = new XmlSerializer(ObjCollection.GetType());
NullReferenceException в данном месте был, хотя показывало как XmlSerializerException

Добавлено через 2 часа 53 минуты
Вопрос все также актуален в силу моей криворукости.
Цитата Сообщение от bodynar Посмотреть сообщение
Вопрос: В какой момент работы приложения лучше сохранять данные?
После изменения данных или при выходе приложения?
C#
1
HardwareButtons.BackPressed += HardwareButtonsBackPressed;
C#
1
2
3
4
5
6
private void HardwareButtonsBackPressed(object sender, BackPressedEventArgs e)
        {
            Controller.Save();
            
            Application.Current.Exit();
        }
Отрабатывает не так идеально, как хотелось бы (приложение закрывается, но студия некоторое время после (минуты полторы) показывает, что оно запущено ещё).
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.02.2016, 00:18     Сохранение данных, Сериализация
Посмотрите здесь:

Сохранение данных - Windows Phone
Как сохранить строковую переменную после закрытия приложения в универсальном приложении.

Сохранение данных при выходе - Windows Phone
Доброго времени суток! Такая у меня сложность, есть 3 textblock'a с переменными числами, как сделать, что бы они сами по себе сохранялись в...

Сохранение данных в ApplicationData.Current.LocalFolder - Windows Phone
Добрый день, попробовал сериализировать обьекты и сохранять их в файл data.xml. Запускаю приложение в эмуляторе. Файл сохраняется, тут же...

Сохранение изменений формы, сериализация. - C#
Здравствуйте! Возник такой вопрос: Есть приложение типа WindowsForms, состояшее из одной формы и компонентов(TextBox, Button,...

Сериализация (а именно -сохранение и открытие проекта) - C++
Задали нам сделать сериализацию проекта. Сколько не читала, сколько примеры не смотрела - ничего толкового ну или хотя бы коряво рабочего...

Сериализация данных - Boost C++
Всем, привет. Интересует несколько вопросов по сериализации данных через boost: 1. Можно ли использовать еще какой-то тип потоков для...

Сериализация данных - C++
Появилась новая проблема. Создаю объект и записываю его в файл через одну функцию: mammal obj(m_s, t_s, s, vod, r, d, v); ...

Unity3d сериализация данных - Unity, Unity3D
Вопрос: нужна ли вообще директива ref при сериализации и как всё будет работать без неё, да и вообще, что она означает? Пишу скрипты на...

Сериализация данных кнопки - C#
Здравствуйте! Нужна помощь с сериализации кнопки находящейся на форме, подскажите пожалуйста что для этого нужно.

Move() и сериализация данных - Lazarus
program switcher; //uses // LConvEncoding; type TSomeRecord = record a: string; b: integer; end;


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Amator
1036 / 368 / 9
Регистрация: 11.11.2008
Сообщений: 3,166
Завершенные тесты: 2
21.02.2016, 23:49     Сохранение данных, Сериализация #2
В App.xaml.cs при создании приложение генерируется такой код
C#
1
2
3
4
5
6
7
8
9
10
11
// Code to execute when the application is deactivated (sent to background)
        // This code will not execute when the application is closing
        private void Application_Deactivated(object sender, DeactivatedEventArgs e)
        {
        }
 
        // Code to execute when the application is closing (eg, user hit Back)
        // This code will not execute when the application is deactivated
        private void Application_Closing(object sender, ClosingEventArgs e)
        {
        }
Мне кажется, лучше всего будет использовать эти два метода для выполнения необходимых вам действий перед закрытием приложения
bodynar
162 / 162 / 51
Регистрация: 14.03.2015
Сообщений: 674
Записей в блоге: 1
Завершенные тесты: 3
23.02.2016, 00:47  [ТС]     Сохранение данных, Сериализация #3
Amator, Как ни странно - таких строчек у меня нету. Навешан обработчик только на сокрытие приложения (OnSuspending). Проект - WP 8.

Не могли бы вы написать полный путь до сих событий?
Спасибо.
Yandex
Объявления
23.02.2016, 00:47     Сохранение данных, Сериализация
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru