2011-07-13 9 views
2

簡単な質問です。 WP7では、IsolatedStorageSettings.ApplicationSettingsを使用して複雑なデータを格納するのは本当に悪い設計/アイデアですか?私はいくつかのクラスオブジェクトのコレクションを保存したい。プロパティは[DataMember]属性でマークされます。windows phone 7 IsolatedStorageSettings.ApplicationSettings複合データ

クラスの例は以下のようになりは、

[DataContract] 
public class OfflineItem 
{ 
    [DataMember] 
    public string Id { get; set; } 
    [DataMember] 
    public MyItem Item { get; set; }  
    [DataMember] 
    public Dictionary<string, string> KeyValues { get; set; }   
} 
Collection<OfflineItems> offlineItems = new Collection<OfflineItems>(); 
..... 
IsolatedStorageSettings.ApplicationSettings["AllOfflineItems"] = offlineItems; 

私はそれを試してみました、それが働いていたが、私はそれが正しいアプローチであるかどうかを知りたいと長期的には任意のパフォーマンスヒットがあるでしょうか?

答えて

0

@Jonnaにあなたのオブジェクトをシリアル化するための汎用的な方法です。私もこのことについて審議しました。私は以下の汎用メソッドを使用して/ adapatingして、以下のようにIsolatedStorageFileを使用してシリアライズおよびデシリアライズを行いました。データを更新しようとしているときにファイルがすでに存在する場合、ファイルの削除も含まれます。

internal static void Write<T>(T obj, string fileName) 
    { 
     XmlWriterSettings writerSettings = new XmlWriterSettings 
     { 
      Indent = true, 
      IndentChars = "\t" 
     }; 

     try 
     { 
      using (var isoStore = IsolatedStorageFile.GetUserStoreForApplication()) 
      { 
       if (isoStore.FileExists(fileName)) 
       { 
        isoStore.DeleteFile(fileName); 
       } 
       using (var isoStream = new IsolatedStorageFileStream(fileName, FileMode.Create, isoStore)) 
       { 
        XmlSerializer serializer = new XmlSerializer(typeof(T)); 

        using (XmlWriter xmlWriter = XmlWriter.Create(isoStream, writerSettings)) 
        { 
         serializer.Serialize(xmlWriter, obj); 
        } 
       } 
      } 
     } 
     catch (IsolatedStorageException ex) 
     { 
      Debug.WriteLine(ex.Message); 
     } 
     catch (Exception emAll) 
     { 
      Debug.WriteLine(emAll.Message); 
     } 
    } 

    internal static T Read<T>(string fileName) 
    { 
     try 
     { 
      using (var isoStore = IsolatedStorageFile.GetUserStoreForApplication()) 
      { 
       using (var isoStream = new IsolatedStorageFileStream(fileName, FileMode.Open, isoStore)) 
       { 
        XmlSerializer serializer = new XmlSerializer(typeof(T)); 
        return (T)serializer.Deserialize(isoStream); 
       } 
      } 
     } 
     catch (IsolatedStorageException ex) 
     { 
      Debug.WriteLine(ex.Message); 
      throw; 
     } 
     catch (Exception emAll) 
     { 
      Debug.WriteLine(emAll.Message); 
      throw; 
     } 
    } 

シリアル化は、このように呼ばれるであろう:

Serialization.Write<user>(userDetails, App.USERDETAILS); 

そしてデシリアライズは、このように呼ばれるであろう:

Items = Serialization.Read<measurements>(App.MEASUREMENTS); 

ユーザは、クラスとuserDetailsでは、そのクラスに基づいてオブジェクトです。 Measurementsはクラスであり、Itemsはそのクラスに基づくオブジェクトです。 App.USERDETAILS & App.MEASUREMENTSは、ファイル名を含むグローバル文字列です。

デバッグ行がそのまま残っているため、進行状況を追跡できます。

マンゴーへの移行を考えている場合は、SQL + LINQを使用することを検討する価値があるかもしれません。その多くはそこで処理される可能性があります。

0

データ(XMLまたはバイナリのいずれか)をIsolatedStorageの別のファイルにシリアル化します。 IsolatedStorageSettings.ApplicationSettingsが過密状態になると、個々の設定をロードするのに時間がかかります。ここで

は、XML

public static string SerializeXml(object objectToSerialize) 
{ 
    using (var ms = new MemoryStream()) 
    { 
     var serializer = new XmlSerializer(objectToSerialize.GetType()); 
     serializer.Serialize(ms, objectToSerialize); 
     ms.Position = 0; 

     using (var reader = new StreamReader(ms)) 
     { 
      return reader.ReadToEnd(); 
     } 
    } 
} 
関連する問題