Сводные данные и изолированное хранилище в 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/