次の方法で共有


CLR 徹底解剖

Silverlight 2 の分離ストレージ

Justin Van Patten

目次

分離
クォータ
ファイルとディレクトリ
IsolatedStorageSettings

MSDN Magazine 2008 年 8 月号の「CLR 徹底解剖」のコラムでは、Andrew Pardoe が Silverlight 2 の分離ストレージについて簡単に説明しました (「CoreCLR を使用して Silverlight のプログラムを記述する」)。このコラムでは、Silverlight での分離ストレージについて詳しく説明し、アプリケーションで分離ストレージを使用するときのベスト プラクティスを示します。

分離ストレージの詳しい説明に入る前に、まず Silverlight で使用可能な I/O 機能について説明します。Silverlight アプリケーションは、Web ブラウザの内部のサンドボックス環境で動作する部分的に信頼されたアプリケーションです。そのため、ファイル システムへの任意のアクセスは許可されません。それに、Web の閲覧中に不作為に遭遇する、悪意がある可能性を持つ Silverlight アプリケーションが個人ファイルにアクセスしたり、システムに悪さをしたりするのは好ましくありません。

ただし、Silverlight アプリケーションにファイル システムへのある程度の限られたアクセスを許可すると役に立つ有効なシナリオもあります。たとえば、エンド ユーザーの同意を得てファイルを読み取るシナリオや、クライアントにデータをローカルに格納するシナリオです。Silverlight 2 では、どちらのシナリオも制限された安全な方法でサポートされます。つまり、前者は OpenFileDialog によって可能になり、後者は分離ストレージで可能になります。

Cookie と同様に、分離ストレージを使用するとアプリケーション呼び出し間でデータをクライアント上に格納できます。ただし、Cookie とは異なり、分離ストレージは完全な仮想ファイル システムであり、アプリケーションで仮想ファイル システムの内部にあるファイルとディレクトリの作成、読み取り、書き込み、削除、および列挙を行うことができます。分離ストレージは、Cookie と同様の方法で使用して状態と簡単なアプリケーション設定を保持できますが、大量のデータをクライアント上にローカルに保存するためにも使用できます。

分離ストレージは Silverlight の新機能ではなく、.NET Framework に V1.0 から組み込まれています。現在の Silverlight には .NET Framework の分離ストレージ API の簡易版のサブセットが付属していますが、いくつかの新しい概念を含む新機能を提供する新しい API も含まれます。

分離

お察しのとおり、分離ストレージの重要な要素の 1 つは分離です。分離ストレージは多数の異なる固有のストアで構成されます。それぞれのストアを独自の仮想ファイル システムと考えることができます。パスは仮想ファイル システムの境界をエスケープできず、そのためにストアはファイル システムの他の部分から実質的に分離されます。これにより、悪意のあるアプリケーションが ..\..\..\..\Windows\System32 のようなディスク上の任意のファイルやディレクトリにアクセスして、破壊行為を行ったり機密情報にアクセスしたりすることはできなくなります。

Silverlight アプリケーションは、2 種類のストアにアクセスできます。ユーザー + アプリケーション ストア (または単にアプリケーション ストア) はユーザー ID とアプリケーション ID によって分離され、ユーザー + サイト ストア (または単にサイト ストア) はユーザー ID とサイト ID によって分離されます。ユーザー、アプリケーション、およびサイトの ID に基づいてストアを分離すると、アプリケーションはアクセスを許可されているストアに対してのみアクセスでき、他のアプリケーションのストアにはアクセスできません。

Silverlight で使用されるユーザー ID は、基盤となるオペレーティング システムのユーザー ID と同じです。Silverlight では、現在のユーザーのローカル アプリケーション データ ディレクトリにすべての分離ストレージ データを格納することによって、ユーザー単位の分離を実現しています。図 1 は、各オペレーティング システムの分離ストレージが存在する場所を詳細に示しています。

図 1 ファイル システムでの分離ストレージの場所
オペレーティング システム ファイル システムでの場所
Windows Vista <SYSTEMDRIVE>\Users\<ユーザー>\AppData\LocalLow
\Microsoft\Silverlight\is
Windows XP <SYSTEMDRIVE>\Documents and Settings\<ユーザー>
\Local Settings\Application Data\Microsoft\Silverlight\is
Mac OS X /Users/<ユーザー>/Library/Application Support/Microsoft/Silverlight/is

アプリケーション ストアはアプリケーション単位の固有のストアです。Silverlight アプリケーションは、Silverlight アプリケーション ストアのみにアクセスできます。他のアプリケーションのアプリケーション ストアにはアクセスできません。アプリケーション ストアはユーザーの ID とアプリケーションの ID に基づいています。Silverlight アプリケーションの ID は、Silverlight アプリケーションの XAP ファイルの完全な URL です。たとえば、https://microsoft.com/app.xap は、https://microsoft.com/app.xap でホストされる Silverlight アプリケーションのアプリケーション ID です。アプリケーション ID の大文字と小文字は区別されないので、https://MICROSOFT.COM/app.XAP と https://microsoft.com/app.xap は同じ ID です。アプリケーション ストアは Silverlight の新機能ではなく、.NET Framework の V2.0 から組み込まれています。アプリケーションのアプリケーション ストアにファイルを作成するコードを次に示します。

try {

    using (var store = IsolatedStorageFile.GetUserStoreForApplication())

    using (var stream = store.CreateFile("hello.txt"))

    using (var writer = new StreamWriter(stream)) {

        writer.Write("Hello World");

    }

}

catch (IsolatedStorageException) {

    // Isolated storage not enabled or an error occurred

}

Silverlight 分離ストレージのベスト プラクティス

分離ストレージを使用するときは、次のガイドラインに従うことで、問題を避け、分離ストレージが提供する保護機能を最大限に活用できます。

  • 発生する可能性がある IsolatedStorageException に対する回復力を確保するために、分離ストレージへのすべての呼び出しを try/catch ブロック内にラップします。この例外は、分離ストレージが無効になった場合またはストアが削除された場合に、スローされる可能性があります。
  • Silverlight アプリケーションで大量のデータを分離ストレージに格納する必要がある場合は、サイトの他のアプリケーションに影響を与えないように、また、他のアプリケーションから影響を受けないように、Silverlight アプリケーションを Silverlight アプリケーション専用のサイトでホストすることを検討します。
  • クライアント上のデータを共有する必要がある Silverlight アプリケーションのグループがある場合は、同じサイトでホストします。
  • 分離ストレージのパスはできる限り短くし、内部の完全パスが 260 文字の制限に達することがないようにします。
  • 分離ストレージに格納する機密データは暗号化します。
  • IsolatedStorageSettings を使用して、オブジェクトと簡単な設定を分離ストレージに格納します。
  • ファイルおよびストリーム ベースの API を使用する場合、大量のデータを格納する場合、または分離ストレージの内容を細かく制御する必要がある場合は、IsolatedStorageFile を使用します。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ここで使用している分離ストレージ API は、System.IO.IsolatedStorage 名前空間にあります。IsolatedStorageFile.GetUserStoreForApplication を呼び出すことで、アプリケーション ストアのインスタンスを取得できます。分離ストレージが有効になっている場合は (Silverlight がインストールされている場合は既定で有効)、ストアの操作に使用できる IsolatedStorageFile のインスタンスが返されます。エンド ユーザーが分離ストレージを無効にしている場合は、IsolatedStorageException がスローされます。

分離ストレージはエンド ユーザーによる有効化および無効化が可能なので、IsolatedStorageFile.GetUserStoreForApplication の呼び出しを常に try/catch ブロックの内部にラップすることが重要です。実際、IsolatedStorageException はどのような分離ストレージ操作でもスローされる可能性があります。たとえば、アプリケーションが分離ストレージを使用している間にエンド ユーザーが分離ストレージを削除した場合、この例外が発生します (次の操作が IsolatedStorageException になります)。また、アプリケーションの複数のインスタンスが動作していて (たとえば、ブラウザの複数のウィンドウやタブなど)、いずれかのインスタンスでストアが削除された場合、他のアプリケーション インスタンスの 1 つで実行される次の分離ストレージ操作で IsolatedStorageException がスローされます。

IsolatedStorageException を防止するために、ベスト プラクティスとして、分離ストレージのすべての呼び出しを try/catch ブロックの内部にラップすることをお勧めします。これを示すために最初のコード サンプルは try/catch ブロックの中にラップしていますが、他のコード サンプルでは簡潔さを優先して try/catch ブロックを示してありません。残りのすべてのコード サンプルは暗黙で try/catch ブロックにラップされているものと考えてください。ベスト プラクティスの要約については、補足記事「Silverlight 分離ストレージのベスト プラクティス」を参照してください。

アプリケーション ストアについてはこれくらいにして、次にサイト ストアについて説明します。サイト ストアは、同じサイトのすべての Silverlight アプリケーションがアクセスできる共有ストアです。これにより、同じサイトのアプリケーション間でデータを共有できます。

Microsoft Office 2007 の各アプリケーション間で共通のユーザー設定を使用するのと同様に、クライアント上に格納された共通の基本設定を共有して同じサイトでホストされる Silverlight アプリケーション スイートを開発できます。サイト ストアはユーザーの ID とサイトの ID に基づきます。Silverlight アプリケーションのサイト ID はアプリケーション ID と似ていますが、URL のスキーム、ホスト、およびポートのみを含み、XAP ファイルへのパスは含みません。アプリケーション ID と同様に、サイト ID も大文字と小文字は区別されません。共有サイト ストアは Silverlight の新機能であり、.NET Framework では使用できません。

IsolatedStorageFile.GetUserStoreForSite を使用してサイト ストアのインスタンスを取得できます。次のコードはこの処理を示しています。

using (var store = IsolatedStorageFile.GetUserStoreForSite())

using (var stream = store.CreateFile("sharedhello.txt"))

using (var writer = new StreamWriter(stream)) {

    writer.Write ("Hello Shared World");

}

同じサイト ID を持つ別のアプリケーションで、次のコードを使用して共有ファイルを読み取ることができます。

using (var store = IsolatedStorageFile.GetUserStoreForSite()) {

    if (store.FileExists("sharedhello.txt")) {

        using (var stream = store.OpenFile("sharedhello.txt", FileMode.Open))

        using (var reader = new StreamReader(stream)) {

            string contents = reader.ReadToEnd(); // "Hello Shared World"

        }

    }

}

Silverlight アプリケーションに対する特定の URL がアプリケーション ID およびサイト ID にどのように対応するのかを理解するには、図 2 を参照してください。このように、最初の 4 つの URL は異なりますが、すべて同じアプリケーション ID とサイト ID に対応します。これは、ID の大文字と小文字が区別されず、クエリ文字列が含まれないうえに、ポート 80 が HTTP スキームの既定のポートであるためです。ただし、8080 などの別のポートが指定されている場合は、アプリケーションの ID は異なると見なされます。ホストから先頭の "www" が省略された場合は、ホストが異なるため、アプリケーション ID は異なると見なされます。

図 2 Silverlight アプリケーションの URL と関連付けられたアプリケーション ID およびサイト ID
アプリケーション URL</b> アプリケーション ID サイト ID
https://www.microsoft.com/
app.xap
HTTP://WWW.MICROSOFT.COM/
APP.XAP
HTTP://WWW.MICROSOFT.
COM
https://www.MICROSOFT.COM/
app.XAP
HTTP://WWW.MICROSOFT.COM/
APP.XAP
HTTP://WWW.MICROSOFT.
COM
https://www.microsoft.com/
app.xap?foo=bar
HTTP://WWW.MICROSOFT.COM/
APP.XAP
HTTP://WWW.MICROSOFT.
COM
https://www.microsoft.com:80/
app.xap
HTTP://WWW.MICROSOFT.COM/
APP.XAP
HTTP://WWW.MICROSOFT.
COM
https://www.microsoft.com:8080/
app.xap
HTTP://WWW.MICROSOFT.COM:
8080/APP.XAP
HTTP://WWW.MICROSOFT.
COM:8080
https://microsoft.com/
app.xap
HTTP://MICROSOFT.COM/
APP.XAP
HTTP://MICROSOFT.
COM
https://www.microsoft.com/
app.xap
HTTPS://WWW.MICROSOFT.COM/
APP.XAP
HTTPS://WWW.MICROSOFT.
COM
https://www.microsoft.com/
demo.xap
HTTP://WWW.MICROSOFT.COM/
DEMO.XAP
HTTP://WWW.MICROSOFT.
COM

安全な HTTPS の URL も、スキーマが異なるので (HTTP ではなく HTTPS)、異なる ID になります。図 2 に示した最後の URL は、表にある最初の 4 つの URL とアプリケーション ID が異なりますが、サイト ID は同じです。つまり、これら 2 つのアプリケーションでは、データを共有サイト ストアに格納することによって、クライアント上で相互にデータを共有できます。

fig03.gif

図 3 分離ストレージのクォータ グループ

クォータ

クォータは、アプリケーションが使用できる分離ストレージ領域の量に対する制限です。クォータには、分離ストレージに格納されるデータと、各ディレクトリおよび新規ファイルを作成することによる追加オーバーヘッド (それぞれ 1 KB) が含まれます。

.NET Framework とは異なり、Silverlight はクォータ グループと呼ばれる概念を使用して分離ストレージ内のクォータを管理します。クォータ グループとは、同じクォータを共有する分離ストアのグループです。Silverlight ではストアはサイトごとにグループ化されるので、サイト ID が同じすべてのアプリケーションは同じ分離ストレージ クォータを共有します。たとえば、microsoft.com でホストされているすべてのアプリケーションは同じクォータを共有します。

分離ストレージで 0 個以上のクォータ グループを使用できます。図 3 は、2 つの架空のクォータ グループが示されています。1 つは microsoft.com のクォータ グループ、もう 1 つは blogs.microsoft.com のクォータ グループです。各クォータ グループには、多くても 1 つの共有サイト ストアと、0 個以上のアプリケーション ストアが含まれます。

既定では、各クォータ グループに 1 MB の既定クォータが割り当てられます。これは、アプリケーションで簡単な設定とテキスト ファイルを分離ストレージに格納するには十分な領域です。ただし、クォータは同じサイト内のすべてのアプリケーションで共有されるので、多くの領域を使用するアプリケーションが 1 つでもあると、簡単にクォータに達する可能性があります。サイトで複数の Silverlight アプリケーションをホストし、各アプリケーションでデータを分離ストレージに格納した場合、空き領域の量はすぐに減少します。さらに、アプリケーションが大量のデータをクライアントに保存する必要がある場合、1 MB の空き領域では常に十分とはいえません。

これに対処するため、アプリケーションでより多くの分離ストレージ領域が必要な場合は、より大きいクォータを要求できるようになっています。アプリケーションから大きいクォータの要求があると、Silverlight はエンド ユーザーに要求の許可または拒否を求めます。次のコードは、より大きいクォータを要求する方法を示しています。

using (var store = IsolatedStorageFile.GetUserStoreForApplication()) {

    // 5 MB of isolated storage space is needed

    int spaceNeeded = 1024 * 1024 * 5;



    if (store.AvailableFreeSpace < spaceNeeded) {

        if (store.IncreaseQuotaTo(store.Quota + spaceNeeded)) {

            // The user accepted the request

        }

    }

}

このコードでは、AvailableFreeSpace プロパティを使用して、分離ストレージで使用可能な空き領域の量を確認しています。コードは 5 MB の空き領域が必要であると認識しています。使用できる領域が 5 MB に満たない場合は、IncreaseQuotaTo を呼び出して要求するクォータ サイズ (バイト単位) を渡し (この場合は現在のクォータに必要な追加領域を加えた値)、クォータの増量を要求します。

IncreaseQuota の呼び出しは、ボタン クリック イベントのハンドラ内など、ユーザーが開始するイベントから行う必要があります。ユーザー開始イベントからの呼び出しでない場合、Silverlight はユーザーにプロンプトを表示せず、要求を拒否します (メソッドは false を返します)。ユーザー開始イベントから呼び出されて、エンド ユーザーが要求を許可した場合は、IncreaseQuotaTo は true を返し、グループのクォータは要求したサイズだけ増やされます。

Silverlight ではクォータはサイト別なので、サイトとアプリケーションの必要に応じて、Silverlight アプリケーションのホスト方法を変えることができます。たとえば、ユーザーの最も好きな 10 本のビデオを分離ストレージに保存する Silverlight ビデオ プレーヤーを作成しているとします。各ビデオは最大 10 MB であり、したがってアプリケーションはクォータを 100 MB より多い値に増やす必要があります。アプリケーションをメイン サイト (contoso.com/player.xap など) でホストすることが可能です。player.xap がそのサイトでホストされる唯一の Silverlight アプリケーションである場合は、うまくいきます。しかし、contoso.com に他にも多くの Silverlight アプリケーションがある場合は、そのすべてが分離ストレージの領域について競合することになります。

この問題を解決するには、ビデオ プレーヤー アプリケーションをそのアプリケーション専用のサブドメイン (player.contoso.com/player.xap など) でホストすることを検討してください。同様に、データの共有が必要な Silverlight アプリケーション スイートを作成する場合は、そのすべてを同じサイトでホストして連携させる必要があります。

Silverlight では、クォータ グループを使用することで、コンピュータ上の分離ストレージの使用をエンド ユーザーが管理しやすくなっています。エンド ユーザーには、異なる複数の Silverlight XAP ファイルを指す URL の長いリストではなく、分離ストレージを使用している Web サイトのリストが示されます。そのため、エンド ユーザーはコンピュータ上にデータを保存するときに、信頼できる Web サイトと信頼できない Web サイトをすばやく判別できます。

分離ストレージは、エンド ユーザーにはアプリケーション ストレージとして表示されます。エンド ユーザーは、[Silverlight の構成] ダイアログを使用して分離ストレージを管理できます。このダイアログを開くには、Web ブラウザで実行している Silverlight アプリケーションを右クリックし、表示されるメニューの [Silverlight の構成] をクリックします。そして、[Silverlight の構成] ダイアログで [アプリケーション ストレージ] タブをクリックします。このタブには、現在分離ストレージを使用している Web サイトの一覧と、それぞれが現在使用しているサイズとクォータが表示されます。この一覧は基本的にクォータ グループの一覧です。この一覧から、エンド ユーザーはグループを削除したり、分離ストレージを有効または無効にしたりできます。

ファイルとディレクトリ

分離ストレージ内にディレクトリとファイルを作成するのは簡単です。図 4 をご覧ください。ここでは、CreateDirectory を使用してディレクトリを作成しています。最上位レベルのディレクトリを作成することも、サブディレクトリを作成することもできます。ストア内に存在するディレクトリの一覧を取得するには、GetDirectoryNames を使用します。

図 4 ディレクトリとファイルを作成する

using (var store = IsolatedStorageFile.GetUserStoreForApplication()) {

    store.CreateDirectory(@"dir1");

    store.CreateDirectory(@"dir1\subdir1");

    store.CreateDirectory(@"dir1\subdir2");

    store.CreateDirectory(@"dir2");



    string[] topLevelDirs = store.GetDirectoryNames(); // { "dir1", "dir2" }

    string[] dir1SubDirs = store.GetDirectoryNames(@"dir1\*"); 

    // { "subdir1", "subdir2" }



    store.CreateFile(@"toplevel.txt");

    store.CreateFile(@"dir1\subdir1\subfile.txt");



    string[] files = store.GetFileNames(); // { "toplevel.txt" }

    string[] subfiles = store.GetFileNames(@"dir1\subdir1\*");

    // { "subfile.txt" }

}

ここではまた、GetDirectoryNames のオーバーロードを使用して、1 文字 ("?") および複数文字 ("*") を表すワイルドカードをサポートする searchPattern 文字列を受け取っています。複数文字 ("*") を表すワイルドカードを使用して "dir1" に含まれるディレクトリを取得していることに注意してください。ファイルの作成はディレクトリの作成と似ています。ファイルはストアのルートに作成することも、ディレクトリ内に作成することもできます。

分離ストレージ内にファイルおよびディレクトリを作成するときは、分離ストレージの相対パスが内部的に完全なシステム パスに展開されることに注意してください (Silverlight アプリケーションが完全なパスを認識することはありません)。完全なパスは、Windows でも Mac でも 260 文字以下に制限されています。そのため、分離ストレージ内での相対パスが 10 文字だけであったとしても、ファイル システム上で分離ストレージが存在するルート システム パスに追加されるときに、10 文字がはるかに長いパスに変換されます。結果のシステム パスが 260 文字を超えると、例外がスローされます。

分離ストレージの場所は、現在のユーザーとオペレーティング システムに依存します。図 1 を再びご覧いただくと、Windows Vista、Windows XP、および Mac OS X での分離ストレージの場所がわかります。

Microsoft\Silverlight\is ディレクトリには、分離ストレージの内部構造が含まれています。ここには、クォータ グループ、ストア、ブックキーピング データなどの情報が、実際のデータと共に Silverlight によって格納されます。このディレクトリの内部にある具体的なファイルとディレクトリは重要ではありませんが (これらは実装の詳細であり、将来のリリースで変更される可能性があります)、ディレクトリ構造によって追加のオーバーヘッドが完全なパスの長さに追加されること注意してください。

たとえば、Silverlight アプリケーションが foo.txt という名前のファイルをアプリケーション ストアのルートに作成したとします。Windows Vista では、このファイルのわかりにくい完全なシステム パスは次のようになります。

C:\Users\<user>\AppData\LocalLow\Microsoft\Silverlight\is\plnvdo2y.zmg\

01ftptzg.h3o\1\s\4onbrsocvqffhjl0kn0sfxcidggvvqzoyl1to4ulrpif1vkwyaaahaa\f\foo.txt

Windows XP では次のようになります。

C:\Documents and Settings\<user>\Local Settings\Application

Data\Microsoft\Silverlight\is\plnvdo2y.zmg\01ftptzg.h3o\1\s\

4onbrsodcvqffhjl0kn0sfxcidggvvqzoylto4ulrpif1vkwyaaahaa\f\foo.txt

Mac OS X では次のようになります。

/Users/<user>/Library/Application

Support/Microsoft/Silverlight/is/plnvdo2y.zmg/01ftptzg.h3o/1/s/

4onbrsodcvqffhjl0kn0sfxcidggvvqzyl1to4ulrpif1vkwyaaahaa/f/foo.txt

<user> が 10 文字であるとすると、foo.txt の完全なパスの長さは、Windows Vista では 158 文字、Windows XP では 190 文字、Mac OS X では 167 文字になります。一般に、現在のユーザーのユーザー名の長さが 10 文字であるとすると、分離ストレージのパスの長さは、Windows Vista では 109 文字以下、Windows XP では 77 文字以下、Mac OS X では 100 文字以下に制限されます。

安全のためのベスト プラクティスとして、分離ストレージのパスはできる限り短くし、内部の完全パスが 260 文字の制限に達するのを防ぐことをお勧めします

図 1 に示した場所を見て興味深いのは、分離ストレージがブラウザの一時インターネット ファイルの一部ではないという事実です。つまり、分離ストレージはサポートされるすべてのブラウザ間で共有され、ユーザー (正確には、読者がサポートするユーザー) が一時インターネット ファイルをクリアしても、分離ストレージの内容は削除されません。

この動作は仕様によるものです。この仕様によって、アプリケーションでは、ユーザーが作成したデータ (ドキュメントや写真など) と、一時インターネット ファイルと共に削除されては困る他の基本設定や各種設定を、分離ストレージに一緒に格納できます。分離ストレージの内容を削除するには、前に説明した [Silverlight の構成] ダイアログを使用します。

また、ご注意いただきたいのは、分離ストレージの場所はわかりにくいようになっており、ストアは他のストアから分離されていますが、分離ストレージに格納するデータは保護されません (つまり、暗号化されません)。そのため、同じコンピュータで動作する他の (Silverlight 以外の) アプリケーションがデータにアクセスできる可能性があります。分離ストレージに機密データを格納する必要がある場合は、暗号化してから格納してください (Silverlight で使用可能な暗号化 API については、MSDN ライブラリで System.Security.Cryptography を参照してください)。

IsolatedStorageSettings

Silverlight には、IsolatedStorageSettings という名前の新しい便利なクラスが含まれています。このクラスを使用すると、オブジェクトをすばやく簡単に分離ストレージに格納できます。IsolatedStorageSettings はディクショナリ コレクションであり、キーと値のペアをアプリケーション ストアまたはサイト ストアに保存しますい。また、オブジェクトのシリアル化と分離ストレージへの保存を自動的に処理します。シリアル化されたオブジェクトは、分離ストレージ内の __LocalSettings という名前のファイルに保存されます。

図 5 のコードは、IsolatedStorageSettings を使用して簡単なオブジェクトをアプリケーション ストアに保存する方法を示しています。ここでは、MySettings という名前のクラスと 3 つのプロパティ Width、Height、Color を定義しています。次に、MySettings のインスタンスを作成し、値をいくつか設定します。それから、settings というキーで IsolatedStorageSettings.ApplicationSettings に追加します。

最後に、Save を呼び出すと、オブジェクトがシリアル化され、シリアル化されたデータがアプリケーション ストアに保存されます。オブジェクトの取得も簡単に行うことができます。

MySettings settings;

if (!IsolatedStorageSettings.ApplicationSettings.TryGetValue("settings",

    out settings)) {

    // Settings was not previously stored in isolated storage

    // create a new object initialized with default values

    settings = new MySettings {

        Width = 100,

        Height = 100,

        Color = Colors.Orange

    };

}

このコードでは、TryGetValue メソッドを使用して、キーが見つからない (つまりデータがまだ保存されていない) 場合の例外を防いでいます。図 5 のコードは、オブジェクトをアプリケーション ストアに保存します。オブジェクトをサイト ストアに保存するには、IsolatedStorageSettings.ApplicationSettings の代わりに IsolatedStorageSettings.SiteSettings を使用します。

図 5 アプリケーション ストアへのオブジェクトの保存

public class MySettings {

    public int Width { get; set; }

    public int Height { get; set; }

    public Color Color { get; set; }

}

var settings = new MySettings {

    Width = 200,

    Height = 300,

    Color = Colors.Blue

};



IsolatedStorageSettings.ApplicationSettings["settings"] = settings;

IsolatedStorageSettings.ApplicationSettings.Save();

簡単なオブジェクトまたは設定を分離ストレージに格納することだけが必要な場合は、IsolatedStorageSettings を使用することに大きな意味があります。一方、分離ストレージに格納するデータの形式を細かく制御する必要がある場合、または大量のデータを格納する場合は、ファイルおよびストリーム ベースの分離ストレージ API を使用することができます。

Silverlight での分離ストレージの詳細については、2009 年 2 月の「Cutting Edge」を参照してください。

ご意見やご質問は clrinout@microsoft.com までお送りください。

Justin Van Patten は、マイクロソフトの CLR チームのプログラム マネージャとして基本クラス ライブラリを担当しています。blogs.msdn.com/bclteam で彼も投稿している BCL チームのブログをご覧いただけます。