Главная » Silverlight » Запрос дополнительного пространства

0

Сначала приложение Silverlight получает 1 Мбайт для изолированного хра­нилища. Проверить объем свободного пространства можно с помощью свойства

IsolatedStorageFile.AvaliableFreeSpace.

Примечание. Для квоты 1 Мбайт есть одно исключение. Если приложение инсталлировано как выполняющееся вне браузера (см. главу 6), его квота автоматически увеличивается до 25 Мбайт. Увеличенная квота действительна независимо от того, как выполняется данное приложение: в окне браузера или в операционной системе в отдельном окне. В обоих случаях приложение пользуется одним и тем же изолированным хранилищем.

Запросить больше пространства можно с помощью метода IsolatedStorageFile. increaseQuotaTo (). При его вызове задается квота — общий объем хранилища в бай­тах. Затем Silverlight выводит окно сообщений, в котором отображены текущее коли­чество байтов, используемых приложением (не текущая квота), и новое запрошенное пространство. Кроме того, в окне приведен адрес URL приложения Silverlight или строка file: //, если приложение выполняется локально.

На рис. 18.2 приведен пример окна сообщений, когда приложение не хранит данные и пытается увеличить квоту до 1 Мбайт. Если пользователь щелкнет на кнопке Yes, что­бы подтвердить запрос, квота будет увеличена и метод IncreaseQuotaTo О возвратит значение true. Если пользователь щелкнет на кнопке No, запрос будет отменен и метод IncreaseQuotaTo () возвратит значение false.

Рис. 18.2. Запрос на увеличение квоты изолированного хранилища

При использовании метода IncreaseQuotaTo () необходимо учитывать следующее.

•       Вызов нужно разместить в обработчике, реагирующем на действие пользовате­ля (например, щелчок на кнопке). Если разместить вызов метода в другом ме­сте (например, в обработчике загрузки страницы), он будет проигнорирован. Это обусловлено требованиями безопасности: необходимо предотвратить случайный запрос большой квоты, когда окно сообщений перехватывает фокус.

•       Запрашивать нужно значение, превышающее текущую квоту. В противном слу­чае будет сгенерировано исключение. Это означает, что метод IncreaseQuotaTo () нельзя использовать для проверки объема доступного пространства. Вместо это­го нужно явно проверить его объем с помощью другого метода.

Текущую квоту можно извлечь с помощью свойства IsolatedStorageFile. Quota. Свойство IsolatedStorageFile.AvailableFreeSpace содержит объем свободного про­странства в изолированном хранилище. Следовательно, объем используемого простран­ства можно вычислить, вычтя второе значение из первого.

Ниже приведен пример использования метода IncreaseQuotaTo ().

using (IsolatedStorageFile store = IsolatedStorageFile.GetUserStoreForApplication ())

// Если приложение записывает 1000 Кбайт данных,

//в хранилище должно быть свободное пространство объемом

//не менее 1000 Кбайт

if (store.AvailableFreeSpace < 1000*1024) {

if (store.IncreaseQuotaTo(

store.Quota + 1000*1024 – store.AvailableFreeSpace)),

{

// Запрос успешный

}

else (

// Запрос неуспешный IblError.Text = "Недостаточно пространства для увеличения квоты."; return;

}

}

// Запись большого файла

}

В данном примере для запроса точного объема пространства используются ариф­метические операции. Проблема состоит в том, что каждый раз, когда понадобится до­полнительное пространство, придется беспокоить пользователя появлением диалогово­го окна. Поэтому лучше запросить пространство с некоторым запасом.

Существует легкий способ выяснить, какой объем пространства занимают изолиро­ванные хранилища каждого используемого приложения Silverlight. Для этого откройте любую страницу с областью содержимого Silverlight, щелкните на ней правой кнопкой мыши и выберите команду Silverlight Configuration (Конфигурация Silverlight). Откроется диалоговое окно с информацией о текущей версии Silverlight, позволяющее управлять обновлениями и лицензиями DRM.

Чтобы увидеть квоты всех приложений, откройте вкладку Application Storage (Хра­нилище приложения). Будет выведен список приложений текущего пользователя, со­держащий объемы используемого пространства и квот. На рис. 18.3 список содержит одно приложение.

Вкладка Application Storage позволяет очистить изолированное хранилище. Для этого выделите приложение и щелкните на кнопке Delete (Удалить). В результате все файлы приложения, находящиеся в изолированном хранилище, будут удалены, а хранилищу будет присвоена стандартная квота 1 Мбайт.

Примечание. Способа уменьшить квоту без удаления содержимого хранилища не существует. Чтобы уменьшить квоту программно, нужно сначала удалить содержимое с помощью метода IsolatedStorageFile. Remove ().

Рис. 18.3. Просмотр текущего объема используемого пространства и квоты

Сохранение объектов с помощью класса XmlSerializer

Как уже упоминалось, записывать файлы в изолированное хранилище Silverlight мож­но с помощью тех же классов доступа к файлам, что и в приложениях .NET, — Stream- Writer и BinaryWriter. Соответственно, для чтения используются классы StreamReader и BinaryReader. Но несмотря на то что данные классы используются чаще всего, это не единственная возможность.

Кроме них, существует высокоуровневый класс XmlSerializer, позволяющий сериа- лизовать и десериализовать объекты вместо чтения и записи отдельных частей данных. Класс XmlSerializer преобразует объект в последовательность байтов, которую можно направить в поток. Кроме того, он выполняет обратную операцию: преобразует последо­вательность байтов, извлеченную из потока, в экземпляр объекта. Для применения класса XmlSerializer нужно добавить в проект ссылку на сборку System.xml.Serialization, dll, которая будет включена в файл ХАР скомпилированного приложения.

Класс XmlSerializer может обработать не каждый объект. При его использовании необходимо учитывать два безусловных ограничения.

•       Сериализуемый класс должен иметь открытый конструктор без аргументов. Этот конструктор будет использоваться в классе XmlSerializer при десериализации нового экземпляра.

•       Сериализуемый класс должен состоять из открытых свойств, доступных для уста­новки. При сериализации объекта класс XmlSerializer читает открытые свой­ства средствами рефлексии. При восстановлении экземпляра класса открытые свойства устанавливаются (опять же, с помощью рефлексии). Закрытые свойства игнорируются. Кроме того, если в сериализуемый класс включены процедуры проверки свойств (например, требующие установки одного свойства перед дру­гим), они, скорее всего, приведут к проблемам.

Существенное преимущество класса XmlSerializer состоит в том, что он предостав­ляет чистый и краткий способ сохранения объекта.

В идеале сериализуемый класс должен содержать простую информацию и не должен содержать никаких методов. Ниже приведен простой класс Person, содержащий инфор­мацию о человеке и применяемый в следующих примерах.

public class Person

{

public string FirstName { get; set; }

public string LastName { get; set; }

public DateTime? DateOfBirth { get; set; }

public Person(string firstName, string lastName, DateTime? dateOfBirth)

{

FirstName = firstName;

LastName = lastName;

DateOfBirth = dateOfBirth;

}

public Person () { }

)

На рис. 18.4 показана тестирующая страница, в которой используются клас­сы XmlSerializer и Person. С ее помощью пользователь может ввести три значения, определяющие экземпляр объекта Person, и сохранить введенную информацию в изо­лированном хранилище. Файлы получают имена на основе имени и фамилии с расши­рением .person, например СергейИванов.person. В левой области страницы приведен список всех файлов .person, записанных в хранилище. Пользователь может выбрать файл и просмотреть или отредактировать хранящиеся в нем данные.

Рис. 18.4. Сохранение данных в файлах с расширением .person

Для данного примера нужно создать экземпляр класса XmlSerilizer, настроенный на использование класса Person и доступный во всех обработчиках событий.

private XmlSerializer serializer = new XmlSerializer(typeof(Person));

Когда пользователь щелкает на кнопке cmdAdd, текущая информация, находящая­ся в двух текстовых полях и элементе DatePicker, используется для создания объекта Person, который сериализуется в изолированное хранилище.

private void cmdAdd_Click(object sender, RoutedEventArgs e) {

Person person = new Person(txtFirstName.Text, txtLastName.Text, dpDateOfBirth.SelectedDate);

using (IsolatedStorageFile store = IsolatedStorageFile.GetUserStoreForApplication())

{

// Метод CreateFileO создает новый или переопределяет // существующий файл

using (FileStream stream = store.CreateFile( person.FirstName + person.LastName + ".person"))

// Сохранение информации в файле serializer.Serialize(stream, person);

}

// Обновление списка

IstPeople.ItemsSource = store. GetFileNames("*.person");

}

}

Когда пользователь щелкает на элементе списка, данные извлекаются из хранилища.

private void lstPeople_SelectionChanged(object sender, SelectionChangedEventArgs e) {

if (IstPeople.Selectedltem == null) return;

using (IsolatedStorageFile store = IsolatedStorageFile.GetUserStoreForApplication ())

{

using (FileStream stream = store.OpenFile( IstPeople.Selectedltem.ToStringO , FileMode.Open))

{

Person person =

(Person)serializer.Deserialize(stream); txtFirstName.Text = person.FirstName; txtLastName.Text = person.LastName; dpDateOfBirth.SelectedDate = person.DateOfBirth;

}

}

}

И наконец, при щелчке на кнопке Удалить выделенный в списке файл удаляется из хранилища.

private void Delete_Click(object sender, RoutedEventArgs e) {

if (IstPeople.Selectedltem == null) return;

using (IsolatedStorageFile store = IsolatedStorageFile.GetUserStoreForApplication())

{

store.DeleteFile(IstPeople.Selectedltem.ToString()) ; IstPeople.ItemsSource = store.GetFileNames("*.person") ;

}

}

Сохранение информации приложения

Обычно изолированное хранилище загружается при запуске приложения или при необходимости. В момент завершения приложения и генерации события Application. Exit хранилище автоматически записывается на диск. Это позволяет сохранять в нем полезную информацию приложения с помощью высокоуровневого класса

IsolatedStorageSettings.

Класс IsolatedStorageSettings предоставляет два статических свойства, со­держащих две коллекции сохраняемой информации. Чаще используется коллекция

IsolatedStorageSettings. ApplicationSettings, содержащая пары имен и значений. Для сохранения информации, добавляемой в класс ApplicationSettings, используется класс XmlSerializer.

Чтобы добавить элемент, нужно присвоить ему строковое ключевое имя. Ниже при­веден пример сохранения текущей даты с ключевым именем LastRunDate.

IsolatedStorageSettings.ApplicationSettings["LastRunDate"] = DateTime.Now;

Следующий оператор сохраняет объект Person с ключевым именем CurrentUser.

IsolatedStorageSettings.ApplicationSettings["CurrentUser"] = new Person(…);

При извлечении необходимо привести объект к правильному типу.

DateTime date = (DateTime) IsolatedStorageSettings. ApplicationSettings["LastRunDate"];

Person person = (Person)IsolatedStorageSettings. ApplicationSettings["CurrentUser"] ;

Метод Contains () используется для проверки, существует ли ключ в коллекции ApplicationSettings, а метод Remove () — для удаления элемента коллекции.

Класс ApplicationSettings автоматически сохраняет всю находящуюся в нем информацию при завершении приложения Silverlight (например, когда пользова­тель переходит на другую страницу). При следующем запуске приложения коллекция ApplicationSettings так же автоматически заполняется сохраненной информацией. Кроме того, класс IsolatedStorageSettijngs предоставляет коллекцию SiteSettings, работающую аналогично. Это нетипизированная коллекция, способная содержать се- риализованные данные любого типа. Ее область видимости ограничена доменом теку­щего сайта. Это означает, что любое приложение Silverlight, выполняющееся в данном домене, имеет доступ к коллекции.

Классы ApplicationSettings и SiteSettings служат всего лишь для упрощения кода. Все, что они делают, можно сделать с помощью изолированного хранилища. Они лишь предоставляют удобное место для хранения небольших порций конфигурацион­ной информации, не заставляя создавать сложные модели данных.

Источник: Мак-Дональд, Мэтью. Silverlight 3 с примерами на С# для профессионалов. : Пер. с англ. —- М. : ООО «И.Д. Вильяме», 2010. — 656 с. : ил. — Парал. тит. англ.

По теме:

  • Комментарии