Isolated storage je uložiště určené pro ukládání perzistentních dat (nejčastěji například konfigurace) s platností pro aplikaci a počítač případně aplikaci a Windows uživatele. V .NET Frameworku implementace Isolated storage zahrnuje dvojici tříd IsolatedStorageFile a IsolatedStorageFileStream. Kromě desktopu je Isolated storage implementován i v Silverlight a případně na platformě Windows Phone (a Windows Metro), kde navíc obsahuje i třídu IsolatedStorageSettings. Protože třída IsolatedStorageSettings může být ale využitelná i ve WPF/Windows Forms, překládám zde její implementaci určenou pro tyto typy aplikací.
Isolated storage je implementován jako speciální složka na file systému, která se nachází buď pod uživatelským profilem nebo v profilu “All users” (v případě ukládání dat s platností pro celý počítač). Třídy IsolatedStorageFile a IsolatedStorageFileStream proto umožňují pracovat s vybraným storem souborově obdobně jako když přistupujeme na standardní file system (lze vytvářet podsložky a soubory).
Třída IsolatedStorageSettings je naopak kolekce aplikačních nastavení typu klíč/hodnota a přistupuje se k ní stejně, jako k objektu typu Dictionary. Realizováno je to pomoci serializace a deserializace tohoto dictionary do souboru na Isolated storage (tento soubor má konkrétně název “__LocalSettings” bez přípony).
V Silverlight je na třídě IsolatedStorageSettings k dispozici jedna kolekce na úrovni aplikace (statická vlastnost ApplicationSettings) a jedna kolekce na úrovni celé domény - podle url aplikace (statická vlastnost SiteSettings). Na desktopu nemá úroveň domény smysl, proto v naportované implementaci je pouze nastavení platné pro danou aplikaci přístupné statickou vlastností ApplicationSettings. Store pro toto nastavení se interně otevírá jako IsolatedStorageScope.Machine, IsolatedStorageScope.Assembly scope pro assembly vrácenou metodou Assembly.GetEntryAssembly.
var assembly = System.Reflection.Assembly.GetEntryAssembly();
if (assembly == null)
{
throw new IsolatedStorageException("Enable to determine application entry assembly.");
}
this._appStore = IsolatedStorageFile.GetStore(IsolatedStorageScope.Machine | IsolatedStorageScope.Assembly, null, null, assembly.Evidence, null);
Druhým rozdílem od Silverlight implementace je nutnost explicitního volání uložení nastavení tj. metody Save při používání této třídy. Toto je způsobeno tím, že uložení aktuálního nastavení do perzistentního souboru na isolated storage je standardně v implementaci voláno pouze ve finalizéru této třídy a ten při ukončení desktop aplikace nemusí být zavolán.
Třída IsolatedStorageSettings je k dispozici zde. Její použití může pak vypadat následovně:
public static int Foo
{
get
{
int value;
if (IsolatedStorageSettings.ApplicationSettings.TryGetValue<int>("Foo", out value))
{
return value;
}
return 0; //Default value
}
set
{
IsolatedStorageSettings.ApplicationSettings["Foo"] = value;
IsolatedStorageSettings.ApplicationSettings.Save();
}
}