UX-TV 2/1 フォローアップ: IsolatedStorageSettingsクラス

IsolatedStorageSettingsクラスを利用すると、分離ストレージに (キー, 値) のペアでデータを格納することができます。

https://msdn.microsoft.com/ja-jp/library/system.io.isolatedstorage.isolatedstoragesettings(v=VS.95).aspx

IsolatedStorageSettings.Addメソッド

https://msdn.microsoft.com/ja-jp/library/system.io.isolatedstorage.isolatedstoragesettings.add(v=vs.95).aspx

を見ると、

public void Add(
    string key,
    Object value
)

という形で、System.Object型のデータを格納することができます。

このSystem.Objectクラス

https://msdn.microsoft.com/ja-jp/library/system.object(v=vs.95).aspx

は、.NET Framework の全クラスの基本クラスであり、各言語では、クラスの Object の継承を宣言する必要はありません。

継承が暗黙的であるので、開発者が独自に作ったクラスもSystem.Objectが基本クラスとなります。

このため、特別な宣言を行わなくても、分離ストレージにオブジェクトを保存できます。

 

(2012/2/2 追記)

・・・と思いきや、落とし穴を発見。

IsolatedStorageSettingsに対してオブジェクトを格納する場合、そのオブジェクトが「シリアル化・逆シリアル化」に対応していることが必須です。

Visual Studioでデバッグ中は、(Saveメソッドを呼び出さない限り)IsolatedStorageSettingsに対してAddメソッドで登録したデータがきちんと保持されています。正しく保存できるかどうかは、Saveメソッドを呼び出して確認が必要です。通常は、このSaveメソッドはアプリケーションの終了時に自動的に呼び出されますが、正しく設定情報が保存されていることを確認するために、開発中にSaveメソッドを呼び出すコードをテストしておくと良いでしょう。

保存できないデータを格納した場合、次のようなエラーが発生します。要するにシリアル化可能でないオブジェクトは保存できません。

issetings-error

System.Object は、 .NET Frameworkの場合、https://msdn.microsoft.com/ja-jp/library/e5kfa45b.aspx にあるように、[SerializableAttribute]があり、シリアル化可能です。

一方、Windows Phone (Silverlight)の場合は、System.Objectは https://msdn.microsoft.com/ja-jp/library/e5kfa45b(v=vs.95).aspx シリアル化可能とは宣言されていません。

クラスをシリアル化するためには、DataContractSerializerが必要になります。

System.Runtime.Serizalizationの参照設定を行い、シリアル化したいクラスに[DataContract]属性を付け、シリアル化したいメンバーに[DataMember]属性を付けます。

https://msdn.microsoft.com/ja-jp/library/system.runtime.serialization.datacontractserializer(v=vs.95).aspx も参考に。

例:

 

namespace ISSetingsTest
{
   
    [DataContract]
    public class FeedItem
    {
        [DataMember]
        public string Title { set; get; }
        [DataMember]
        public Uri uri { set; get; }
        [DataMember]
        public string Summary { set; get; }
        public FeedItem(string title, string summary, Uri u)
        {
            this.Title = title;
            this.uri = u;
            this.Summary = summary;
        }

    }

    [DataContract]
    public class Feed
    {
        [DataMember]
        public List<FeedItem> Items { set; get; }
    }
}

 

// FeedクラスのオブジェクトをSettingsに保存

IsolatedStorageSettings s = IsolatedStorageSettings.ApplicationSettings;
Feed f = (Feed)this.DataContext;
s["feed"] = f;
s.Save();

 

必要な場合に検討ください。