【问题标题】:windows phone 7 IsolatedStorageSettings.ApplicationSettings complex datawindows phone 7 隔离存储设置.应用设置复杂数据
【发布时间】:2011-07-14 04:28:48
【问题描述】:

只是一个简单的问题。在 WP7 中,使用 IsolatedStorageSettings.ApplicationSettings 存储复杂数据真的很糟糕吗?我想保存一些类对象的集合。属性标有 [DataMember] 属性。

一个类的例子是,

[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;

我试过了,它奏效了,但我想知道这是否是一种正确的方法,从长远来看会不会影响性能?

【问题讨论】:

    标签: windows-phone-7


    【解决方案1】:

    @乔娜。我也考虑过这个。我最终使用/改编了以下通用方法来使用如下的 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);
    

    user 是一个类,而 userDetails 是一个基于该类的对象。 Measurements 是一个类,Items 是基于该类的对象。 App.USERDETAILS 和 App.MEASUREMENTS 是包含文件名的全局字符串。

    一些调试行已被保留,以便可以跟踪进度。

    如果您正在考虑迁移到 Mango,也可能值得考虑使用 SQL + LINQ,并且可以在那里解决大部分问题...

    【讨论】:

      【解决方案2】:

      我会将我的数据(XML 或二进制)序列化到独立存储中的单独文件中。因为如果 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();
              }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多