• Microsoft .NET
  • WPF и Silverlight
  • Элементы управления пользовательского интерфейса Silverlight (User Interface Controls)

Сводные данные и изолированное хранилище в Silverlight - Структурированное изолированное хранилище

ОГЛАВЛЕНИЕ

Структурированное изолированное хранилище

Эта функция позволяет приложению запоминать адреса веб-каналов пользователя и загружать их при запуске приложения. Упаковка адресов URI в строки с разделителем -- вариант простой, но ни изящный, ни расширяемый. Например, если нужно сохранить более одного скалярного значения, то с данной методикой это будет затруднительно.

Еще один способ сохранить данные в изолированном хранилище – использование классов IsolatedStorageFile и IsolatedStorageFileStream, что позволяет сохранять более сложные структуры данных, в том числе сериализуемые объекты, на каждого пользователя. Данные можно даже сегментировать в разные файлы и папки в изолированном хранилище. Это идеальный вариант для организации данных, которые будут сохранены в изолированном хранилище. Например, можно создать папку для всех статических списков данных, и отдельный файл – для каждого списка. Следовательно, в папке, которая находится в изолированном хранилище, может существовать файл для префиксов имен, еще один – для пола и еще один – для штатов США.

Приложение-образец может создать файл в изолированном хранилище, который будет содержать список адресов Uri. Данные необходимо сначала сериализовать, а затем отправить в файл в изолированном хранилище (это показано на рис. 7). Сначала создается экземпляр класса IsolatedStorageFile для текущего пользователя с помощью метода GetUserStoreForApplication. Затем создается файловый поток, чтобы приложение смогло записать адрес Uri. После этого выполняется сериализация данных, и они записываются в экземпляр IsolatedStorageFileStream. Это приложение-образец выполняет сериализацию строки, но в изолированное хранилище можно также записать любой сериализуемый объект.

Рис. 7 Сохранение сериализованных данных в файл изолированного хранилища

private void SaveFeedsToStorage_UsingFile() {
  using (var isoStore = IsolatedStorageFile.GetUserStoreForApplication())
{
  List<string> data = GetFeedsFromStorage_UsingFile();
  if (data == null)
  if (txtAddress.Text.Length == 0)
  return;
  else
  data = new List<string>();
  using (var isoStoreFileStream =
  new IsolatedStorageFileStream(FEED_FILENAME,
  FileMode.Create, isoStore)) {
  data.Add(txtAddress.Text);
  byte[] bytes = Serialize(data);
  isoStoreFileStream.Write(bytes, 0, bytes.Length);
  }
  }
}

Чтение сериализованных данных из файла, который находится в изолированном хранилище, – процесс чуть более сложный, чем в предыдущем примере. На рис. 8 показано, что перед чтением в первую очередь необходимо получить экземпляр класса IsolatedStorageFile для пользователя, а затем проверить, существует ли файл. Если файл существует, то он открывается с доступом на чтение, и это позволяет выполнить чтение данных через поток типа IsolatedStorageFileStream. Выполняется чтение данных из потока, а затем они компонуются и десериализуются, чтобы их можно было использовать для загрузки сводного содержимого веб-канала.

Рис. 8 Чтение сериализованных данных из файла изолированного хранилища

private List<string> GetFeedsFromStorage_UsingFile() {
  byte[] feedBytes;
  var ms = new MemoryStream();
  using (var isoStore = 
  solatedStorageFile.GetUserStoreForApplication())
  {
  if (!isoStore.FileExists(FEED_FILENAME)) return null;
  using (var stream = isoStore.OpenFile(FEED_FILENAME, 
  FileMode.Open, FileAccess.Read)) {
  while (true) {
  byte[] tempBytes = new byte[1024];
  int read = stream.Read(tempBytes, 0, tempBytes.Length);
  if (read <= 0) {
  //feedBytes = ms.ToArray();
  break;
  }
  ms.Write(tempBytes, 0, read);
  }
  }
  feedBytes = ms.ToArray();
  List<string> feedList = Deserialize(typeof(List<string>), 
  feedBytes) as List<string>;
  return feedList;
  }
}

private void LoadFeedsFromStorage_UsingFile() {
  var feedList = GetFeedsFromStorage_UsingFile();
  foreach (var address in feedList) {
  Uri feedUri;
  Uri.TryCreate(address, UriKind.Absolute, out feedUri);
  if (feedUri != null)
  LoadFeed(feedUri);
  }
}

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

Обратите также внимание на то, что пользователи могут полностью очищать хранилище когда угодно, поскольку обладают полным доступом к своим параметрам. Это значит, что данные, которые хранятся в изолированном хранилище, не следует рассматривать как гарантированное хранилище состояния объектов. Еще один хороший пример – хранение списка штатов США в изолированном хранилище, чтобы не приходилось каждый раз создавать веб-запрос (и обращение к базе данных), когда требуется заполнить поле со списком штатами США.

Заключение

Образец приложения показывает, насколько просто загрузить веб-каналы RSS и AtomPub в приложение Silverlight. Благодаря Silverlight можно сделать веб-запрос, принять его результаты, обработать вызовы междоменной политики, загрузить данные веб-канала в классы SyndicationFeed, запросить их с помощью LINQ, выполнить их привязку к элементам пользовательского интерфейса и сохранить данные веб-канала в изолированном хранилище.

Хану Коммалапати рассказывает о создании бизнес-приложений с помощью Silverlight, об этом можно узнать в его статьях, выпущенных в этом и прошлом месяце: «Silverlight: Создание бизнес-приложений уровня предприятия с помощью Silverlight, часть 1» и «Silverlight: Создание бизнес-приложений уровня предприятия с помощью Silverlight, часть 2».

Скачать исходники примеров кода 

Автор: Джон Папа
Источник: http://msdn.microsoft.com/ru-ru/magazine/